将拥有的实体存储为 JSON,并管理对象图的更新

问题描述 投票:0回答:1

我使用 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 映射的复杂类型并且它(尚未)尚未实现。有替代解决方案吗?

c# postgresql entity-framework-core ef-code-first npgsql
1个回答
0
投票

复杂类型(相对于实体类型)正是这里所寻求的功能。截至撰写本文时,将复杂类型存储为 JSON 而不是存储在单独的表中的功能尚未实现

相反,使用 Postgresql 和 Npgsql,可以选择“JsonDocument DOM 映射”,直到内置 EFCore 功能可用为止。

© www.soinside.com 2019 - 2024. All rights reserved.