C# EF核心、每个层次结构的表和同一基类的引用实体生成错误

C# EF核心、每个层次结构的表和同一基类的引用实体生成错误,c#,entity-framework-core,table-per-hierarchy,C#,Entity Framework Core,Table Per Hierarchy,我们通过每个层次结构的表存储联系人, 联系人可以是一家公司,也可以是一个人,而且一个人总是属于一家公司。 两者都是从接触中继承的 使用EF Core 2.1 看起来像这样 public abstract class Contact { public virtual Guid Id { get; set; } public virtual ICollection<Source> Sources{ set; get; } = new Collection<Sourc

我们通过每个层次结构的表存储联系人, 联系人可以是一家公司,也可以是一个人,而且一个人总是属于一家公司。 两者都是从接触中继承的

使用EF Core 2.1

看起来像这样

public abstract class Contact {
    public virtual Guid Id { get; set; }
    public virtual ICollection<Source> Sources{ set; get; } = new Collection<Source>();
}

public class Company : Contact {
    public string CompanyName { set; get; }
    public virtual ICollection<Person> People { set; get; } = new Collection<Person>();
}

public class Person: Contact {
    public string Name { set; get; }
    public DateTime Birthday { set; get; }
    public virtual Company Company { set; get; }
}
我们已经花了数小时甚至数天的时间试图找到问题的根源和解决办法,但都无济于事

EF Core与我们的构造不知何故相悖也许构造本身是错误的

如果禁用懒散加载,问题就会消失

知道原因是什么吗?有什么办法可以解决这个问题

编辑2 我删除了源代码,因为它们似乎与问题无关

编辑3 我加了一个


只需将DbContextFactory中的ConnectionString更改为您的本地路径。

我能够在EF Core 2.1.4和2.2预览版中使用提供的repo复制它

正如您在上一次更新中提到的,这个问题在某种程度上与延迟加载代理有关,因为w/o UseLazyLoadingProxies代码按预期工作,这就是我最初无法复制它的原因


由于这显然是EF核心错误,所以您只能将其报告给并等待修复。不幸的是,您可能无法在即将发布的2.2版本中获得该功能,但谁知道呢,它值得一试。

我能够在EF Core 2.1.4和2.2预览版中通过提供的回购重现该功能

正如您在上一次更新中提到的,这个问题在某种程度上与延迟加载代理有关,因为w/o UseLazyLoadingProxies代码按预期工作,这就是我最初无法复制它的原因


由于这显然是EF核心错误,所以您只能将其报告给并等待修复。不幸的是,您可能无法在即将发布的2.2版本中包含这些内容,但谁知道呢,这是值得尝试的。

在我看来,这就像实体框架中的一个bug,但是您可以通过显式指定自动生成的属性来防止这种情况的发生,例如显式地将CompanyId属性添加到Person类中

这将防止EF Core将生日列错误地映射到CompanyId列

public class Person : Base
{
    // ...

    public virtual Company Company { set; get; }    
    public Guid? CompanyId { get; set; }
}

在我看来,这似乎是实体框架中的一个bug,但是您可以通过显式指定自动生成的属性来防止这种情况的发生,例如显式地将CompanyId属性添加到Person类中

这将防止EF Core将生日列错误地映射到CompanyId列

public class Person : Base
{
    // ...

    public virtual Company Company { set; get; }    
    public Guid? CompanyId { get; set; }
}

无法复制EF Core 2.1.4 SqlServer LocalDB。您使用了哪个SqlServer版本?LocalDB。在Visual Studio内部的Sql Server对象资源管理器中显示Sql Server 12.0.2000。我添加了一个示例repo,该示例演示了无法复制EF Core 2.1.4 Sql Server LocalDB的行为。您使用了哪个Sql Server版本?LocalDB。在Visual Studio内的Sql Server对象资源管理器中显示Sql Server 12.0.2000。我添加了一个示例repo,它演示了您的行为!很好的解决方法,应该包含在bug报告中。好了!好的解决方法,应该包括在错误报告中。