Entity Framework Core 3.1 Enum Conversion не удалось при преобразовании значения nvarchar EnumValue в тип данных int

Я использую Entity Framework Core 3.1 и пытаюсь выполнить простой запрос свойства перечисления в моей сущности в моей локальной базе данных, и я продолжаю получать эту ошибку:

Ошибка преобразования перечисления при преобразовании значения 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; }
}

Enum - Позиция:

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
}

DbContext:

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) - не сработало

Когда я запрашиваю таблицу следующим образом, я получаю ошибку преобразования

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

Position имеет тип NVARCHAR(MAX) в моей базе данных.

введите здесь описание изображения

введите здесь описание изображения

Я упускаю что-нибудь простое? Не могу понять, где я ошибаюсь. Пожалуйста помогите.


person fingers10    schedule 05.04.2020    source источник
comment
.HasConversion<string>() - правильное отображение. Что не сработало?   -  person Ivan Stoev    schedule 05.04.2020
comment
Пробовал добавить.HasConversion<string>(). Когда запрос выполняется, я получаю ту же ошибку.   -  person fingers10    schedule 05.04.2020
comment
Я изменил запрос на query.Where(x => x.Position.Equals(Position.Accountant.ToString())).ToListAsync(). Теперь запрос выполняется, но я не получаю результатов. Любая идея?   -  person fingers10    schedule 05.04.2020
comment
Спасибо, мне удалось воспроизвести это. Еще одна ошибка EFC.   -  person Ivan Stoev    schedule 05.04.2020


Ответы (1)


Поскольку тип столбца базовой базы данных является строковым, преобразователь значений ассоциации является правильным отображением (по умолчанию 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

что переводится правильно.

В общем, избегайте EqualsCompare, CompareTo и т. Д.) Методов, когда есть соответствующий оператор C #.

person Ivan Stoev    schedule 05.04.2020