我使用 EF Core (8.x) 和 Posgresql 来存储一些数据。具体来说,我有一个实体类型,它有一个包含整个对象图的(导航)属性,我已在
OnModelCreating
中将其指定为拥有并存储为 JSON(在 jsonb 列中):
var entityBuilder = modelBuilder.Entity<OwningEntityType>();
entityBuilder.OwnsOne(c => c.OwnedNavigationProperty, b => {
b.ToJson();
b.OwnsMany(c => c.ListOfThings);
b.OwnsMany(c => c.OtherListOfThings, b => {
b.OwnsOne(v => v.Thing);
});
b.OwnsMany(c => c.LastListOfThings);
});
我希望能够跳过所有这些仪式并简单地指定
OwnsOne
和 ToJson
,但这会导致错误(因为 EFCore 希望对象图中的每个类型都是一个实体)。不过,这一切都很好,我可以处理这个问题,但是当更新 OwnedNavigationProperty
中引用的对象图时,我收到错误:
System.InvalidOperationException:属性“OtherListOfThingsType.ThingId”是键的一部分,因此无法修改或标记为已修改。
这让我感到困惑,首先是
OtherListOfThingsType.ThingId
是一个实际上并不存在于任何地方的属性。无论如何,我真正的问题是:
有没有办法告诉 EFCore,“任何时候此对象图中更新任何内容(您可以将对该状态的检测留给我),只需重新序列化整个事物,不要尝试协调更改“?本质上,我希望将
OwningEntityType.OwnedNavigationProperty
视为标量值,而不是实体类型的对象图。
这本质上是 Npgsql 的旧 POCO 映射功能 提供的功能,但现在已弃用。
看起来我正在寻找的东西被称为带有 JSON 映射的复杂类型并且它(尚未)尚未实现。有替代解决方案吗?
复杂类型(相对于实体类型)正是这里所寻求的功能。截至撰写本文时,将复杂类型存储为 JSON 而不是存储在单独的表中的功能尚未实现。
相反,使用 Postgresql 和 Npgsql,可以选择“JsonDocument DOM 映射”,直到内置 EFCore 功能可用为止。