gpt4 book ai didi

c# - "The owned entity type requires to be referenced from another entity type via a navigation"

转载 作者:行者123 更新时间:2023-12-05 03:04:57 25 4
gpt4 key购买 nike

我的应用程序中有一个名为 Person 的实体。有两种类型的用户,Student 和 Professor,继承自 Person。

每个人都有一个设置属性:

public abstract class Person
{
public Guid UserId { get; set; }
public string Name { get; set; }

public PersonSettings Settings { get; set; }
}

public class Student : Person
{
}

public class Professor : Person
{
}

我的 PersonSettings 类只有几个属性。它不是要存储在数据库中的实体,因此我将其标记为 Owned:

[Owned]
public class PersonSettings
{
public bool NotificationsEnabled { get; set; }
public int GymPassId { get; set; }
}

这些作为 json 存储在数据库中,我在我的 Person 实体配置中使用 EF Core 转换值来序列化和反序列化它:

builder.Property(p => p.Settings).HasConversion(
s => JsonConvert.SerializeObject(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),
s => JsonConvert.DeserializeObject<PersonSettings>(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));

但是当我尝试运行我的应用程序并进行数据库迁移时,我收到一条错误消息

The owned entity type 'PersonSettings' requires to be referenced from another entity type via a navigation. Add a navigation to an entity type that points at 'PersonSettings'.

我应该在这里做什么?我在错误消息中找不到任何内容。不确定这是否与 Person 是一个抽象类有关。

最佳答案

我也无法复制,但您在这里不需要拥有类型。

使用自有类型是使用非标量属性的 JSON 序列化的替代方法。使用自有类型时,类型与引用它的实体一起存储。因此,自有类型 EF 将创建 Person 表,其中包含用于 Settings_NotificationEnabled 和 Settings_GymPassId 的单独列。

因此您可以简单地删除 OwnedAttribute,并确保您没有将其声明为具有 DbSet<PersonSettings> 类型属性的实体。在你的 DbContext 中。

至于选择哪个,我通常会在这种情况下使用自有类型,因此您可以通过各个 PersonSettings 属性查询数据库。

使用非标量属性的 JSON 转换对于您拥有集合的情况非常有用,因为 EF Core 目前不支持拥有类型的集合。

关于c# - "The owned entity type requires to be referenced from another entity type via a navigation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51678433/

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