Список <Enum>не может быть сопоставлен - PullRequest
0 голосов
/ 31 октября 2018

У меня есть модели в моем проекте .Net Core, где я хочу иметь список Enum.

public class CartOptional
    {
        [Required]
        public Guid Id { get; private set; }
        public int Price { get; set; }
        public string CartId { get; set; }
        public string Type { get; set; }
        public List<FieldValidator> Validators { get; set; }
        public string Label { get; set; }
        public string Value { get; set; }
        public DateTime CreatedAt { get; set; } = DateTime.Now;
        public DateTime UpdatedAt { get; set; } = DateTime.Now;
    }

FieldValidator действительно является Enum

EF верните мне эту ошибку:

Не удалось отобразить свойство CartOptional.Validators, так как оно имеет тип «Список», который не является поддерживаемым типом примитива или допустимым типом объекта. Либо явным образом сопоставьте это свойство, либо игнорируйте его, используя атрибут «[NotMapped]» или «EntityTypeBuilder.Ignore» в «OnModelCreating».

Я пробовал другое решение, например добавление [Serializable]. Но, похоже, ничего не работает. Я не понимаю, почему система не может принять базовый int

РЕДАКТИРОВАТЬ:

Я попробовал решение с аннотацией [Flags], вот так

[Flags]
public enum FieldValidator
{
    REQUIRED = 1,
    ALPHABETIC = 2,
    NUMERIC = 4,
    EMAIL = 8,
    PHONE = 16,
    DATE = 32
}

А в родительском классе у меня public FieldValidator Validators { get; set; }

Но теперь я пытаюсь POST новый элемент, и я получаю эту ошибку, когда я пытаюсь проверить ModelState:

"tierList [0] .fieldList [0] .validators": [ "Неожиданный токен StartArray при разборе enum. Путь 'tierList [0] .fieldList [0] .validators', строка 24, позиция 25." ]

Что такое token StartArray?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Проблема не в перечислении вообще. Это Список . Вы получите ту же ошибку, даже если вы попытаетесь

public List<int> Validators { get; set; }

или

public List<string> Validators { get; set; }

или любой другой тип.

Это даже не ограничение EF, а сама база данных . Вы пытаетесь добавить список значений в столбец таблицы. Базы, которые я знаю, не имеют конфигурации для такой вещи.

Если вы хотите прикрепить список значений в таблицу базы данных, можно создать новую таблицу (возможно, новую таблицу поиска в вашем случае), которая содержит внешний ключ для CartOptional. Примерно так:

public class FieldValidatorEntity
{
    public int Id { get; set; }

    public int CartOptionalId { get; set; }
    public CartOptional CartOptional { get; set; }

    public FieldValidator Value { get; set; }
    // other columns
}

И используйте это свойство в вашей CartOptional сущности:

public List<FieldValidatorEntity> Validators { get; set; }

Обходным решением было бы сделать Validators строковым свойством и содержать что-то вроде значений, разделенных запятыми, или даже попробовать байтовый массив, если он вам подходит. Базы данных могут хранить байтовые массивы в столбце.

Надеюсь, я смогу помочь, веселое кодирование!

0 голосов
/ 31 октября 2018

Одно значение Enum не должно быть проблемой, но поскольку Enum является просто целочисленным значением, вы не можете использовать его как (список) сущностей. Вы должны либо явно сделать Enum сущностью, либо использовать Enum Flags вместо этого (что я бы порекомендовал).

Взгляните на Работа с перечисляемыми значениями в Entity Framework , например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...