List<Enum> 无法映射

Rag*_*nar 1 c# enums entity-framework .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;
    }
Run Code Online (Sandbox Code Playgroud)

FieldValidator 确实是一个枚举

EF 返回此错误:

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

我尝试了不同的解决方案,例如添加[Serializable]. 但似乎没有任何效果。我不明白为什么系统不能接受基础int

编辑:

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

[Flags]
public enum FieldValidator
{
    REQUIRED = 1,
    ALPHABETIC = 2,
    NUMERIC = 4,
    EMAIL = 8,
    PHONE = 16,
    DATE = 32
}
Run Code Online (Sandbox Code Playgroud)

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

但是现在我尝试发布一个新元素,当我尝试验证以下内容时出现此错误ModelState

"tierList[0].fieldList[0].validators": [ "解析枚举时出现意外标记 StartArray。路径 'tierList[0].fieldList[0].validators',第 24 行,位置 25。" ]

什么是token StartArray

小智 5

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

public List<int> Validators { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者

public List<string> Validators { get; set; }
Run Code Online (Sandbox Code Playgroud)

或任何其他类型。

这甚至不是 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
}
Run Code Online (Sandbox Code Playgroud)

并在您的CartOptional实体中使用此属性:

public List<FieldValidatorEntity> Validators { get; set; }
Run Code Online (Sandbox Code Playgroud)

一种解决方法是创建Validators一个字符串属性并保存诸如逗号分隔值之类的内容,或者甚至尝试使用适合您的字节数组。数据库可以将字节数组存储在列中。

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