C# 如何映射简单数据类型的列表而不必对其进行字符串化?
我正在C#.NET Core 2.2中制作一个API,并试图找出如何正确映射枚举和字符串列表 现在我有以下解决方案: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 {
[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));