【发布时间】:2020-08-15 05:12:06
【问题描述】:
我有一个使用 EF Core 和 Postgres 数据库的 .NET Core 3.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; }
}
jsonb 列本身是在这样的表上定义的:
public class MyTable {
[Column(TypeName = "jsonb")]
public Dictionary<string, Entry> Entries { get; set; }
}
现在的问题是它根本不起作用。当我使用 EF Core 从数据库中获取条目时,“Entries”属性确实包含一个带有单个键“entry1”的字典,但该键的值是一个空的 Entry 对象(名称和内容均为空)。
Npgsql documentation on mapping jsonb columns to POCOs 没有解释在这种情况下如何处理字典。我在 jsonb 列中找不到任何带有顶级字典的示例,所以我不完全确定我这样做是否正确。
如何正确连接它,以便我的 jsonb 列映射到 Entry 对象的字典?
【问题讨论】:
-
从我目前使用 Npgsql 的经验来看,映射似乎必须相当具体。这意味着您的 POCO 必须与您在 json 中提供的密钥相匹配。如果是我,我可能会将 JSON 作为一个完整的字符串读取,然后使用帮助程序/服务对其进行解析。看起来麻烦会出现在您的“入口”对象的级联中。
-
@GingerNinja 如果属性直接是列表或 Entry 类,它可以开箱即用,只有 Dictionary 不起作用。我不确定这是否只是 EF Core npgsql 没有实现的一种情况,或者我在这里做错了什么。刚才我发现了如何手动定义序列化,它甚至可以使用Entry对象之间的递归链接。但据我了解,这个版本的处事比较有限(例如不支持查询)
标签: .net-core entity-framework-core npgsql