Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;所属实体类型需要通过导航从另一实体类型引用;_C#_Entity Framework_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# &引用;所属实体类型需要通过导航从另一实体类型引用;

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 {

我的应用程序中有一个名为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:

[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开始,支持所有类型的集合。