List <枚举>无法映射

时间:2018-10-31 10:19:17

标签: c# entity-framework enums .net-core

.Net Core项目中有一些模型,我想要一个枚举列表。

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确实是一个枚举

EF向我返回此错误:

  

无法映射属性“ CartOptional.Validators”,因为该属性的类型为“列表”,而不是受支持的原始类型或有效的实体类型。要么显式映射此属性,要么使用“ [NotMapped]”属性或“ OnModelCreating”中的“ EntityTypeBuilder.Ignore”忽略它。

我尝试了其他解决方案,例如添加[Serializable]。但是似乎没有任何作用。我不明白为什么系统无法使用底层int

编辑:

我尝试使用[Flags]注释这样的解决方案

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

在父类中,我有public FieldValidator Validators { get; set; }

但是现在我尝试发布一个新元素,并且当我尝试验证ModelState时出现此错误:

  

“ tierList [0] .fieldList [0] .validators”:[           “解析枚举时出现意外的令牌StartArray。路径'tierList [0] .fieldList [0] .validators',第24行,位置25。”       ]

什么是token StartArray

2 个答案:

答案 0 :(得分:2)

问题根本不是枚举。这是列表。即使您尝试过,您也会得到相同的错误

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设置为字符串属性,并保存类似逗号分隔的值,或者尝试使用字节数组(如果适合)。数据库可以将字节数组存储在列中。

希望我能帮上忙, 快乐的编码!

答案 1 :(得分:1)

一个Enum值不应该成为问题,但是由于Enum只是一个整数值,因此您不能将其用作(列表)实体。您应该显式地将枚举设为实体,或者改为使用标志枚举(我​​建议这样做)。

例如,看看Working with Enumerated Values in Entity Framework