“拥有的实体类型需要通过导航从另一个实体类型引用”

我的应用程序中有一个名为 Person 的实体。有两种类型的用户,学生和教授,它们继承自 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]

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 }));

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


拥有的实体类型“PersonSettings”需要通过导航从另一个实体类型中引用。向指向“PersonSettings”的实体类型添加导航。


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


蝴蝶刀刀
浏览 148回答 2
2回答

凤凰求蛊

我也无法重现,但您不需要这里的拥有类型。使用拥有的类型是使用非标量属性的 JSON 序列化的替代方法。使用拥有的类型时,类型与引用它的实体一起存储。因此,拥有类型 EF 将创建具有单独的 Settings_NotificationEnabled 和 Settings_GymPassId 列的 Person 表。因此,您可以简单地删除 OwnedAttribute,并确保您没有将其声明为DbSet<PersonSettings>DbContext 中具有类型属性的实体。至于选择哪个,我通常会在这种情况下使用拥有类型,因此您可以通过各个 PersonSettings 属性查询数据库。使用非标量属性的JSON转换为对,你有一个集合的情况下非常有用,因为EF核心目前不支持所属类型的集合。

一只甜甜圈

我遇到了同样的问题,为我解决的是遵循此处的文档。基本上你想要做的是OwnsOne在你的实体配置中添加一个Person:builder.OwnsOne(p => p.PersonSettings, ps => {&nbsp; &nbsp; //if need be add additional settings here for NotificationsEnabled and GymPassId});这将在 Person 和 PersonSettings 之间创建一个“链接”,迁移生成器使用它来构建脚本。
打开App,查看更多内容
随时随地看视频慕课网APP