.net core 使用Postgres jsonb列中的顶级字典映射到POCOs

.net core 使用Postgres jsonb列中的顶级字典映射到POCOs,.net-core,entity-framework-core,npgsql,.net Core,Entity Framework Core,Npgsql,我有一个使用EF Core和Postgres数据库的.NETCore3.1应用程序。在数据库中,我有一个jsonb列,现在我想将它映射到EF Core中定义良好的类集 jsonb列的内容如下所示: { "entry1": { "name": "entry1", "contents": { "entry1.1": { "name": "entry1.1" },

我有一个使用EF Core和Postgres数据库的.NETCore3.1应用程序。在数据库中,我有一个jsonb列,现在我想将它映射到EF Core中定义良好的类集

jsonb列的内容如下所示:

{
    "entry1": {
        "name": "entry1",
        "contents": {
            "entry1.1": {
                "name": "entry1.1"
            },
            "entry1.2": {
                "name": "entry1.2",
                "contents": {
                    "entry1.2.1": {
                        "name": "entry1.2.1"
                    }
                }
            }
        }
    }
}
在顶层,它是一个将字符串映射到条目的字典。每个条目都有一个名称,可以有内容,这也是一个将字符串映射到条目的字典

public class Entry
{
    public string name { get; set; }
    public Dictionary<string, Entry> contents { get; set; }
}
公共类条目
{
公共字符串名称{get;set;}
公共词典内容{get;set;}
}
jsonb列本身在如下表中定义:

public class MyTable {
    [Column(TypeName = "jsonb")]
    public Dictionary<string, Entry> Entries { get; set; }
}
公共类MyTable{
[列(TypeName=“jsonb”)]
公共词典条目{get;set;}
}
现在的问题是它根本不起作用。当我使用EF-Core从数据库中获取条目时,“Entries”属性确实包含一个带有单个键“entry1”的字典,但该键的值是一个空的
entry
对象(名称和内容都为null)

在这种情况下,没有解释如何处理字典。我在jsonb列中找不到任何具有顶级字典的示例,因此我不能完全确定我是否做对了


如何正确地将其连接起来,以便将我的jsonb列映射到条目对象的字典?

以下内容似乎很有效:

类程序
{
静态void Main(字符串[]参数)
{
使用(var createCtx=new BlogContext())
{
createCtx.Database.EnsureDeleted();
createCtx.Database.recreated();
createCtx.Blogs.Add(新博客
{
条目=新词典
{
{“bla”,新条目{Foo=“foo1”}
}
});
createCtx.SaveChanges();
}
使用var ctx=new BlogContext();
var results=ctx.Blogs.Single();
Console.WriteLine(results.Entries[“bla”].Foo);
}
}
公共类BlogContext:DbContext
{
公共数据库集博客{get;set;}
静态iLogger工厂上下文Logger工厂
=>LoggerFactory.Create(b=>b.AddConsole().AddFilter(“,LogLevel.Information));
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
=>选项生成器
.UseNpgsql(@“主机=本地主机;数据库=测试;用户名=npgsql_测试;密码=npgsql_测试”)
.EnableSensitiveDataLogging()
.UseLoggerFactory(ContextLoggerFactory);
}
公共类博客
{
公共int Id{get;set;}
[列(TypeName=“jsonb”)]
公共词典条目{get;set;}
}
公开课入学
{
公共字符串Foo{get;set;}
}
在数据库中:

test=# select * from "Blogs"
test-# ;
 Id | Name |         Entries          
----+------+--------------------------
  1 |      | {"bla": {"Foo": "foo1"}}
(1 row)

根据我目前使用Npgsql的经验,映射似乎必须相当具体。这意味着您的POCO必须与json中提供的密钥相匹配。如果是我,我可能会将JSON作为一个完整的字符串读取,然后用助手/服务解析它。问题似乎会出现在“条目”对象的级联中。@gingernija如果属性是一个列表或条目类,那么它是开箱即用的,只有字典不起作用。我不确定这是否仅仅是EF Core npgsql没有实现的一种情况,或者我在这里做了一些错误的事情。我刚刚发现了如何手动定义序列化,它甚至可以用于条目对象之间的递归链接。但据我所知,这个版本的doing things更为有限(例如,没有查询支持),这很奇怪,它看起来与我试图做的事情非常相似,我现在看不到任何相关的区别。我必须更仔细地将其与我自己的版本进行比较,看看我做了什么不同。感谢您提供了一个完整的自包含示例,这将对您的实验非常有帮助。