gpt4 book ai didi

entity-framework-core - 如何使用 Entity Framework Core 2 中的每层级表 (TPH) 模式将列持久保存为 json

转载 作者:行者123 更新时间:2023-12-05 05:11:02 24 4
gpt4 key购买 nike

我正在尝试使用每个层次结构一个表的模式来存储一个表,但我想将其存储为 json,而不是每个派生字段的列。我只是在做 inheritance section 中的示例在 .net Entity Framework 核心文档中:

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; }
}

这将正常工作并将每个属性存储为一列,如此处的屏幕截图所示:

columns

我想要实现的是将属性存储为 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<IPolyEntity>(x.JsonField))
.ToList();

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

无论如何。 将 JSON 打包的实体存储到关系数据库中会强制您保持与实体模型的兼容性。当您更改实体属性时,它将中断,除非您没有以某种方式设法更新数据库中烘焙的所有 JSON .如果可以选择,请避免使用它。

关于entity-framework-core - 如何使用 Entity Framework Core 2 中的每层级表 (TPH) 模式将列持久保存为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55953963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com