Entity framework core 如何在EntityFrameworkCore2中使用每层次表(TPH)模式将列持久化为json

Entity framework core 如何在EntityFrameworkCore2中使用每层次表(TPH)模式将列持久化为json,entity-framework-core,ef-core-2.2,tph,Entity Framework Core,Ef Core 2.2,Tph,我试图使用每个层次结构的表模式来存储一个表,但是我希望将它存储为json,而不是每个派生字段的列。我只是从.net实体框架核心文档中的示例中进行了如下操作: class MyContext:DbContext { 公共数据库集博客{get;set;} 模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder) { modelBuilder.Entity().HasBaseType(); } } 公共类博客 { public int BlogId{get;set;} 公共字符

我试图使用每个层次结构的表模式来存储一个表,但是我希望将它存储为json,而不是每个派生字段的列。我只是从.net实体框架核心文档中的示例中进行了如下操作:

class MyContext:DbContext
{
公共数据库集博客{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().HasBaseType();
}
}
公共类博客
{
public int BlogId{get;set;}
公共字符串Url{get;set;}
}
公共类RssBlog:Blog
{
公共字符串RssUrl{get;set;}
}
这将很好地工作,并将每个属性存储为一列,如屏幕截图所示:

我试图实现的是将属性存储为json列,而不是多列。它可能看起来像这样:

| BlogId | Discriminator | json                                                                                          |
|--------|---------------|-----------------------------------------------------------------------------------------------|
| 1      | Blog          | {"Url": "http://blogs.msdn.com/dotnet"}                                                       |
| 2      | RssBlog       | {"Url": "http://blogs.msdn.com/adonet", "RssUrl": "http://blogs.msdn.com/b/adonet/atom.aspx"} |
其主要思想是,我希望按照TPH模式所允许的方式,将某一类型的继承对象存储到同一个表中,但使用json列而不是多列

这是否可能在EF Core 2.2中实现

否。


这项功能不是EF的固有功能,如果有可能的话,这是一个问题。 但是你可以自己做

您可以为此实体构建自己的存储库。在内部,它使用EF作为数据源,您必须自己完成所有映射。 您可能需要构建自己的变更跟踪实现,以实现适当的更新功能

第二种方法是将整个实体打包到JSON字段中,并使用EF作为简单的数据源。然后你可以用这样的东西提取你的实体…:


var data=DbContext.MyPolymorphData
.Select(x=>JsonConvert.Deserialize(x.JsonField))
.ToList();
。。使用Json.NET包,该包允许将对象类型与对象数据一起存储到Json中,然后分别对其进行反序列化。 但是更新仍然会有PITA——在更新之后,您应该将数据序列化回母实体,并让EF决定是否有任何更改。 啊

无论如何将JSON压缩的实体存储到关系数据库中会迫使您保持与实体模型的兼容性。当您更改实体属性时,它将中断,除非您没有以某种方式更新数据库中烘焙的所有JSON。 如果你有选择,就避免它