为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
蝴蝶刀刀 2021-11-14 16:04:51
我的应用程序中有一个名为 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 作为抽象类有关。
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

我也无法重现,但您不需要这里的拥有类型。

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

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

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

使用非标量属性的JSON转换对,你有一个集合的情况下非常有用,因为EF核心目前不支持所属类型的集合。


查看完整回答
反对 回复 2021-11-14
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我遇到了同样的问题,为我解决的是遵循此处的文档。


基本上你想要做的是OwnsOne在你的实体配置中添加一个Person:


builder.OwnsOne(p => p.PersonSettings, ps => {

    //if need be add additional settings here for NotificationsEnabled and GymPassId

});

这将在 Person 和 PersonSettings 之间创建一个“链接”,迁移生成器使用它来构建脚本。


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号