1

我正在尝试使用 table-per-hierarchy 模式存储表,但不是每个派生字段的列,而是将其存储为 json。我只是在 .net 实体框架核心文档中的继承部分做示例,如下所示:

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RssBlog>().HasBaseType<Blog>();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

public class RssBlog : Blog
{
    public string 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 中实现吗?

4

1 回答 1

2

不久,

不。


此功能对于 EF 来说不是本机的,如果有的话,这是一个问题。但是……你可以自己做。

您可以为此实体构建自己的存储库。在内部,它使用 EF 作为数据源,您必须自己完成所有映射。您可能必须构建自己的更改跟踪实现才能获得正确的更新功能。

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


var data = DbContext.MyPolymorphData
    .Select(x => JsonConvert.Deserialize<IPolyEntity>(x.JsonField))
    .ToList();

.. 使用 Json.NET 包,该包允许将对象类型与对象数据一起存储到 JSON 中,然后分别对其进行反序列化。但是更新后仍然会有 PITA - 更新后您应该将数据序列化回母实体并让 EF 决定是否有任何更改。啊。

反正。将 JSON 打包的实体存储到关系数据库中会迫使您保持与实体模型的兼容性。当您更改实体属性时,它会中断,除非您没有设法更新数据库中烘焙的所有 JSON。如果你有选择,避免它。

于 2019-05-02T15:02:56.553 回答