.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
?
答案 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只是一个整数值,因此您不能将其用作(列表)实体。您应该显式地将枚举设为实体,或者改为使用标志枚举(我建议这样做)。