Entity Framework 将 nvarchar 值 'EnumValue' 转换为数据类型 int 时,Core 3.1 枚举转换失败

Entity Framework Core 3.1 Enum Conversion failed when converting the nvarchar value 'EnumValue' to data type int

我正在使用 Entity Framework Core 3.1 并尝试在我的 localdb 实体中的枚举 属性 上进行简单查询,但我不断收到此错误:

Enum conversion failed when converting the nvarchar value 'Accountant' to data type 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; }
}

枚举 - 位置:

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
}

数据库上下文:

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);
    }
}

我尝试添加价值转换:

  1. .HasConversion<string>() - 没用
  2. .HasConversion(converter) - 没用

当我按如下方式查询 table 时,出现转换错误

try
{
    var test = await query.Where(x => x.Position.Equals(Position.Accountant)).ToListAsync();
}
catch (System.Exception e)
{
    //throw;
}

Position 在我的数据库中属于 NVARCHAR(MAX) 类型。

我是不是遗漏了什么简单的东西?无法弄清楚我哪里出错了。请协助。

由于底层数据库列类型是字符串,因此关联值转换器是正确的映射(默认情况下 EF Core 将 enums 映射到 int)。

所以这样的事情是必须的

modelBuilder.Entity<DemoEntity>()
    .Property(e => e.Position)
    .HasConversion<string>();

这导致了最初的问题。看起来您遇到了 EF Core 查询翻译错误 - 表达式

x.Position.Equals(Position.Accountant)

被错误地翻译成

WHERE [d].[Position] = 0

而不是预期

WHERE [d].[Position] = N'Accountant'

解决方案是使用比较运算符(==!=)而不是 Equals:

x.Position == Position.Accountant

翻译正确。

在有相应的 C# 运算符时,一般避免使用 Equals(和 CompareCompareTo 等)方法。