C# &引用;所属实体类型需要通过导航从另一实体类型引用;
我的应用程序中有一个名为Person的实体。有两种类型的用户,学生和教授,继承自Person 每个人都有一个设置属性:C# &引用;所属实体类型需要通过导航从另一实体类型引用;,c#,entity-framework,asp.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,Entity Framework Core,我的应用程序中有一个名为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 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核心转换值对其进行序列化和反序列化:
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 }));
builder.Property(p=>p.Settings).HasConversion(
s=>JsonConvert.SerializeObject(s,新的JsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore}),
s=>JsonConvert.DeserializeObject(s,新的JsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore});
但是,当我尝试运行我的应用程序并进行数据库迁移时,我得到一个错误,即
所拥有的实体类型“PersonSettings”需要通过导航从其他实体类型引用。向指向“PersonSettings”的实体类型添加导航
我在这里该怎么办?我在错误消息中找不到任何内容。不确定它是否与Person是一个抽象类有关。我也不能重新编写,但这里不需要拥有类型 使用自有类型是对非标量属性使用JSON序列化的替代方法。使用自有类型时,该类型与引用它的实体一起存储。因此,作为所有者,类型EF将创建Person表,其中包含设置\u NotificationEnabled和设置\u GymPassId的单独列 因此,您只需删除OwnedAttribute,并确保在您的DbContext中不将其声明为具有类型为
DbSet
的属性的实体
至于选择哪一个,我通常会在这个场景中使用一个Owned类型,因此您可以通过个人PersonSettings属性查询数据库
使用非标量属性的JSON转换对于拥有集合的情况非常有用,因为EF Core当前不支持所拥有类型的集合。我也遇到了同样的问题,解决这个问题的方法是遵循文档 基本上,您要做的是在
个人的实体配置中添加一个OwnsOne
:
builder.OwnsOne(p => p.PersonSettings, ps => {
//if need be add additional settings here for NotificationsEnabled and GymPassId
});
这将在Person和PersonSettings之间创建一个“链接”,迁移生成器将使用该链接构建脚本。无法使用最新的EF Core 2.1.1位进行复制。你能包括所有相关的fluent配置吗?我不小心在我的上下文中添加了它作为数据库集,谢谢!从EF Core 2.2开始,支持所有类型的集合。