fin*_*s10 2 c# enums entity-framework-core entity-framework-core-3.1
我正在使用 Entity Framework Core 3.1 并尝试对 localdb 中实体的枚举属性进行简单查询,但不断收到此错误:
将 nvarchar 值“Accountant”转换为数据类型 int 时枚举转换失败
实体:
public class DemoEntity
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Position Position { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
枚举 - 位置:
public enum Position
{
[Display(Name = "Accountant")]
Accountant,
[Display(Name = "Chief Executive Officer (CEO)")]
ChiefExecutiveOfficer,
[Display(Name = "Integration Specialist")]
IntegrationSpecialist,
[Display(Name = "Junior Technical Author")]
JuniorTechnicalAuthor,
[Display(Name = "Pre Sales Support")]
PreSalesSupport,
[Display(Name = "Sales Assistant")]
SalesAssistant,
[Display(Name = "Senior Javascript Developer")]
SeniorJavascriptDeveloper,
[Display(Name = "Software Engineer")]
SoftwareEngineer
}
Run Code Online (Sandbox Code Playgroud)
数据库上下文:
public class DemoDbContext : DbContext
{
public DemoDbContext(DbContextOptions options)
: base(options) { }
public DbSet<DemoEntity> Demos { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//var converter = new ValueConverter<Position, string>(
// v => v.ToString(),
// v => (Position)Enum.Parse(typeof(Position), v));
//var converter = new EnumToStringConverter<Position>();
modelBuilder
.Entity<DemoEntity>()
.Property(e => e.Position);
//.HasColumnType("nvarchar(max)")
//.HasConversion<string>();
//.HasConversion(converter);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试添加价值转换:
.HasConversion<string>()- 没用.HasConversion(converter)- 没用当我按如下方式查询表时,出现转换错误
public class DemoDbContext : DbContext
{
public DemoDbContext(DbContextOptions options)
: base(options) { }
public DbSet<DemoEntity> Demos { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//var converter = new ValueConverter<Position, string>(
// v => v.ToString(),
// v => (Position)Enum.Parse(typeof(Position), v));
//var converter = new EnumToStringConverter<Position>();
modelBuilder
.Entity<DemoEntity>()
.Property(e => e.Position);
//.HasColumnType("nvarchar(max)")
//.HasConversion<string>();
//.HasConversion(converter);
}
}
Run Code Online (Sandbox Code Playgroud)
这Position是我的数据库中的类型NVARCHAR(MAX)。
我错过了什么简单的事情吗?无法弄清楚我哪里出错了。请协助。
由于底层数据库列类型是字符串,因此关联值转换器是正确的映射(默认情况下 EF Core 将enums 映射到int)。
所以这样的事情是必须的
modelBuilder.Entity<DemoEntity>()
.Property(e => e.Position)
.HasConversion<string>();
Run Code Online (Sandbox Code Playgroud)
这导致了原来的问题。看起来您遇到了 EF Core 查询翻译错误 - 表达式
x.Position.Equals(Position.Accountant)
Run Code Online (Sandbox Code Playgroud)
被错误地翻译成类似的东西
WHERE [d].[Position] = 0
Run Code Online (Sandbox Code Playgroud)
而不是预期的
WHERE [d].[Position] = N'Accountant'
Run Code Online (Sandbox Code Playgroud)
解决方案是使用比较运算符 (==和!=) 而不是Equals:
x.Position == Position.Accountant
Run Code Online (Sandbox Code Playgroud)
翻译正确。
一般情况下,当存在相应的 C# 运算符时,请避免使用Equals(andCompare等)方法。CompareTo
| 归档时间: |
|
| 查看次数: |
3983 次 |
| 最近记录: |