C# 如何映射简单数据类型的列表而不必对其进行字符串化?

C# 如何映射简单数据类型的列表而不必对其进行字符串化?,c#,entity-framework-core,C#,Entity Framework Core,我正在C#.NET Core 2.2中制作一个API,并试图找出如何正确映射枚举和字符串列表 现在我有以下解决方案: [NotMapped] public virtual IList<string> OtherNames { get; set; } = new List<string>(); public string OtherName { get {

我正在C#.NET Core 2.2中制作一个API,并试图找出如何正确映射枚举和字符串列表

现在我有以下解决方案:

        [NotMapped]
        public virtual IList<string> OtherNames { get; set; } = new List<string>();
        public string OtherName
        {
            get
            {
                return JsonConvert.SerializeObject(OtherNames);
            }
            set
            {
                OtherNames = JsonConvert.DeserializeObject<List<string>>(value);
            }
        }
控制器方法,调用存储库方法 控制器返回 简单数据类型列表的当前映射由fluent API自动映射,因为它可以自动映射字符串属性OtherName

其他名称未映射。

选项1(“无需第二个属性的更简单映射”)可通过EF Core实现:

值转换器允许在读取或写入数据库时转换属性值。此转换可以是从一个值到同一类型的另一个值(例如,加密字符串),也可以是从一个类型的值到另一个类型的值(例如,将枚举值转换为数据库中的字符串)

基本上只在实体类中保留以下内容:

public IList<string> OtherNames { get; set; } = new List<string>();
public IList OtherNames{get;set;}=new List();
并在模型配置中将值转换器与其关联:

modelBuilder.Entity<Celebrity>()
    .Property(e => e.OtherNames)
    .HasConversion(
        value => JsonConvert.SerializeObject(value),
        dbValue => JsonConvert.DeserializeObject<List<string>>(dbValue));
modelBuilder.Entity()
.Property(e=>e.OtherNames)
.哈斯转换(
value=>JsonConvert.SerializeObject(值),
dbValue=>JsonConvert.DeserializeObject(dbValue));
唯一的潜在问题可能是在LINQ to Entities查询中使用
OtherNames
属性(例如,执行过滤),如当前:

  • 使用值转换可能会影响EF Core将表达式转换为SQL的能力。对于此类情况,将记录警告。正在考虑在将来的版本中删除这些限制

由于
OtherNames
public
并通过get、set设置为
自动属性
,因此您甚至不需要
公共字符串OtherName
,或者如果您想保留
公共字符串OtherName
,则将
OtherNames
更改为不带get的私有字段,您可能正在查找JsonIgnore属性,与实体框架NotMapped的行相同。但上面的代码似乎很奇怪。Json serialiser应该能够返回对象列表将其设置为private而不是public,这样就解决了不将两者都发送到API调用的问题。但是,我不知道如何将这两个属性合并为一个属性,并且仍然正确地映射它们。我只是希望能够合并这两个属性,或者大幅度减小它们的大小,或者找到一种在不干扰API调用的情况下正确映射它们的方法。
        public Celebrity GetBy(int id)
        {
            return _celebrities
              .Include(c => c.Favorite)
              .Include(c => c.Read)
              .Include(c => c.Relationships)
                .ThenInclude(r => r.With)
              .SingleOrDefault(c => c.Id == id);
        }
{"id":-1,"image":".png","firstName":"Louis","lastName":"Sachar","placeBorn":249,"whenBorn":"1954-03-20T00:00:00","whenDied":null,"description":"...","favorite":null,"read":[],"relationships":[],"nationalities":[],"nationality":"[]","otherNames":[],"otherName":"[]","jobs":[],"job":"[]"}
public IList<string> OtherNames { get; set; } = new List<string>();
modelBuilder.Entity<Celebrity>()
    .Property(e => e.OtherNames)
    .HasConversion(
        value => JsonConvert.SerializeObject(value),
        dbValue => JsonConvert.DeserializeObject<List<string>>(dbValue));