虽然这个问题是针对 Entity Framework 提出的,但我有完全相同的问题,但针对 Entity Framework Core。事实证明,EF Core 有一种更优雅的方法来将序列化数据存储在单个列中,同时允许单个属性存在于域模式中。更优雅,因为它不需要对领域模型本身进行任何更改。
是这样的:
您的实体保持原样:
public class MyEntity
{
public int Id {get;set;}
public string Name {get;set;}
public int Age {get;set;}
public string OtherData {get;set;}
public List<Blabla> BlaBlaList {get;set;}
}
然后配置您的模型以忽略您不想映射到单个列的属性,并添加一个 shadow 属性:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Ignore(x => x.Age);
modelBuilder.Ignore(x => x.OtherData);
modelBuilder.Ignore(x => x.BlaBlaList);
// Adding a "shadow" property called "Data".
modelBuilder.Property<string>("Data");
}
当您现在保存实体时,您可以简单地将所需的属性序列化为 JSON 字符串并设置“数据”影子属性,如下所示:
var entity = new MyEntity { ... };
var data = new
{
entity.Age,
entity.OtherData,
entity.BlaBlaList
};
var json = JsonConvert.Serialize(data);
_dbContext.Property("Data").CurrentValue = json;
当从存储中加载您的实体时,请确保重新水合属性:
var entity = await _dbContext.MyEntities.FirstOrDefaultAsync(...);
// Simply re-constructing the anonymous type for deserialization. It's not necessary to actually initialize each field with the current values (which are empty anyway), but this is just a convenient way to model the anonymous type.
var data = new
{
entity.Age,
entity.OtherData,
entity.BlaBlaList
};
var json = _dbContext.Property("Data").CurrentValue = json;
data = JsonConvert.DeserializeAnonymousType(json, data);
entity.Age = data.Age;
entity.OtherData = data.OtherData;
entity.BlaBlaList = data.BlaBlaList;
就是这样。 EF Core 允许您通过利用其新的影子属性功能将您的域模型用作纯粹、干净的 POCO。