首页 > 解决方案 > 列表无法映射

问题描述

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

标签: c#entity-frameworkenums.net-core

解决方案


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

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

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


推荐阅读