EF中多态的多对多关系

时间:2019-02-25 09:25:43

标签: c# entity-framework-6 polymorphism entity-relationship

我在一个实体类型上有一个多态集合,其中包含作为其子类型的对象的集合。 子类型都存储在数据库的不同表中。

我需要在流畅的API中映射此关系,以便我可以管理级联。 这是我拥有的实体结构的示例...

[Table("Reports", "Reporting")]
class Report
{
    [Key]
    public int Id { get; set; } 
    public virtual ICollection<Entry> Entries { get; set; }
}

abstract class Entry
{
   [Key]
   public int Id {  get; set; }
   public virtual ICollection<Report> Reports { get; set; }
}

[Table("InvoiceEntries", "Reporting")]
class InvoiceEntry : Entry
{
    public ICollection<Invoice> Invoices { get; set; }
}

... <other types> like InvoiceEntry each mapped to their own tables ...

在我的模型配置中,我有...

builder.Ignore<Entry>();

更新

如评论中所述,这里有一个关于多态关系的好答案...

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

...我的情况是“每个具体类型的表”中的“多对多” 关系是多态的。

虽然描述很好,但似乎无法涵盖这种情况

1 个答案:

答案 0 :(得分:0)

嗯...好吧,很奇怪... 因此事实证明,只有当您足够好让您知道从子基类型派生的类型不能以这种方式工作时,这种方法才有效。

示例...

[Table("Reports", "Reporting")]
class Report
{
    [Key]
    public int Id { get; set; } 
    public virtual ICollection<Entry> Entries { get; set; }
}

abstract class Entry
{
   [Key]
   public int Id {  get; set; }
   public virtual ICollection<Report> Reports { get; set; }
}

[Table("InvoiceEntries", "Reporting")]
class InvoiceEntry : Entry
{
    public ICollection<Invoice> Invoices { get; set; }
}

class PaymentEntry
{
   [ForeignKey("Payment")]
   public int PaymentId { get;set; }

   public virtual Payment Payment { get; set; }
}

事实证明,存在一个问题,即报表对象需要使用Fluent API映射PaymentEntry子类型,并关闭级联,以防止出现多个级联路径。

如果所有子类型仅具有InvoiceEntry样式,则多对多映射EF可以自行解决。

为避免这种流畅的脚本,避免其他关系以避免级联问题,或者将所有子类型纳入多对多关系。