【问题标题】:List<Enum> could not be mappedList<Enum> 无法映射
【发布时间】:2018-10-31 10:19:16
【问题描述】:

我的 .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

【问题讨论】:

  • 为什么要尝试列出?解释一下?
  • 为什么使用Serializable 属性?该错误表示问题出在类型本身。 FieldValidator 是什么?除非它是一个映射到另一个表的 entity,否则 EF 将不知道如何处理它。它是否代表表中的 5 列?用作位域的单个int?还有什么?
  • @Ragnar 如果枚举是 Flag,则属性不应该是 List&lt;FiledValidator&gt;,而应该是 public FieldValidator Validators { get; set; }

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


【解决方案1】:

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

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 成为一个字符串属性并保存类似逗号分隔的值,或者如果它适合您,甚至可以尝试一个字节数组。数据库可以在一列中存储字节数组。

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

【讨论】:

  • 对于枚举,我使用[Flag] 属性,但这是我为其他列表所做的方法。就像我说的,我来自 NoSQL(主要是 Mongo)世界。我必须记住这个区别。
【解决方案2】:

一个Enum 值应该不是问题,但由于枚举只是一个整数值,因此您不能将其用作(列表)实体。您应该明确地将 Enum 设为实体,或者改用 Flags Enum(我会推荐)。

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

【讨论】:

  • 在表中存储位域本身就是一个问题,因为它们无法被索引或查询。
  • 这就是为什么我还建议明确地将 Enum 设为实体,或者使用 Flags Enum 代替 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多