C# 在一个实体中是否可能有多个具有相同基类(TPH)的实体集合属性?

C# 在一个实体中是否可能有多个具有相同基类(TPH)的实体集合属性?,c#,entity-framework-core,C#,Entity Framework Core,在我的项目中,我使用EntityFrameworkCore2.0。 下一个代码稍微简化。有这样的模式: public class Site { public int Id { get; set; } public string Name { get; set; } public ICollection<AudioLink> AudioLinks { get; set; } public ICollection<VideoLink> Vid

在我的项目中,我使用EntityFrameworkCore2.0。 下一个代码稍微简化。有这样的模式:

public class Site
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public ICollection<AudioLink> AudioLinks { get; set; }
    public ICollection<VideoLink> VideoLinks { get; set; }
}

public abstract class Link
{
    public int Id { get; set; }         
    public string Href { get; set; }

    public int SiteId { get; set; }
    public Site Site { get; set; }
}

public class AudioLink : Link
{
}

public class VideoLink : Link
{
}
引发下一个异常,无法将类型为“ApplicationCore.Entities.AudioLink”的对象强制转换为类型为“ApplicationCore.Entities.VideoLink”。
您能告诉我做错了什么吗?

继承并没有改变单个引用导航属性只能映射到单个反向集合导航属性的规则

事实上,第二个HasMany/WithOne覆盖了前一个,可能是一个bug,应该抛出异常,因此Link.Site映射到Site.AudioLinks,而不是说该站点是基本实体站点的属性,因此由AudioLink和VideoLink共享

因此,您必须从基类中删除Site和SiteId属性,并将它们放入将引入2个FK关系的派生类中,或者最好使用基类的单个集合导航属性:

public class Site
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public ICollection<Link> Links { get; set; }
}
和映射:

builder.Entity<Site>().HasMany(s => s.Links)
   .WithOne(l => l.Site)
   .HasForeignKey(l => l.SiteId);

站点物化后,您始终可以使用OfType运算符从LINQ到实体查询或LINQ到对象中的链接获取音频链接或视频链接。

继承不会更改单个引用导航属性只能映射到单个反向集合导航属性的规则

事实上,第二个HasMany/WithOne覆盖了前一个,可能是一个bug,应该抛出异常,因此Link.Site映射到Site.AudioLinks,而不是说该站点是基本实体站点的属性,因此由AudioLink和VideoLink共享

因此,您必须从基类中删除Site和SiteId属性,并将它们放入将引入2个FK关系的派生类中,或者最好使用基类的单个集合导航属性:

public class Site
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public ICollection<Link> Links { get; set; }
}
和映射:

builder.Entity<Site>().HasMany(s => s.Links)
   .WithOne(l => l.Site)
   .HasForeignKey(l => l.SiteId);

在站点物化之后,您始终可以使用OfType运算符从LINQ to Entities查询或LINQ to Objects中的链接获取音频链接或视频链接。

您可以拒绝继承,或者使用集合类型作为基类型。对HasMany的调用都是错误的,不应该编译。感谢帮助,@hvost!您的意思是我应该使用ICollection Links属性而不是Site类中的两个属性来保持继承和一个表吗?@OL-Oh当然!否则,你为什么需要这笔遗产而且,我强烈建议在公共类中使用ICollection而不是List,这一点很重要。您可以拒绝继承,或者使用集合类型作为基类型。对HasMany的调用都是错误的,不应该编译。感谢您的帮助,@hvost!您的意思是我应该使用ICollection Links属性而不是Site类中的两个属性来保持继承和一个表吗?@OL-Oh当然!否则,你为什么需要这笔遗产而且,我强烈建议在公共类中使用ICollection而不是List,这一点很重要。如果我没有弄错的话,根据这种说法,类似的行为可以在实体框架中实现。这种方法会在EF core的下一个版本中实现吗?我认为这篇文章是不正确的。EF6和EF Core在这方面是相同的,可能被接受的答案的作者并不是指使用EF继承策略,只是基类和2个完全独立的表,如果我没有弄错的话,根据这个相似的行为可以在实体框架中实现。这种方法会在EF core的下一个版本中实现吗?我认为这篇文章是不正确的。EF6和EF Core在这方面是相同的,可能被接受的答案的作者不是指使用EF继承策略,只是基类和2个完全独立的表,