EF Code First中的多个继承级别

时间:2013-04-08 17:27:54

标签: c# entity-framework asp.net-mvc-4

我试图弄清楚如何处理多种类型的继承。我有一个现有的Code First / EF / MVC项目,它在生产环境中有实时数据。系统使用一种称为“文档”的类型,可以在其上执行许多功能,并且有许多关联的表可以链接到DocumentID。

目前存在更多差异化的文档,即采购订单,它实现了一些更具体的属性,例如引用产品的“OrderLines”集合,数量和单价。还有一些特定于采购订单的其他字段。除了与具有“OrderLines”的基础凭证类型不同之外,采购订单是供应方文档,因此,它的第三方是“供应商”。可能还有其他供应方文档,将来也有供应商作为第三方。

我现在准备实施一个新的文档类型,即Demand Side,这意味着它将有一个名为customer的第三方。它还有一个OrderLines集合。

我的系统目前设置为TPH,因此该表称为“文档”,并且有一个鉴别器列,其中显示内部的文档是采购订单。

如何添加新类型并使用继承来实现OrderLines集合和CustomerID / Customer链接?似乎c#不能进行多重继承,因此以下内容是不可能的:

  

文件 - > OrderLinesDocument - > PurchaseOrder的

     

文件 - > OrderLinesDocument - >发票

     

文件 - > VendorDocument - > PurchaseOrder的

     

文件 - > CustomerDocument - >发票

中间类会实现许多文档可能共有但不是所有文档的字段吗?

有没有办法使用接口完成此操作,并且仍然让EF正确地找出表格?

1 个答案:

答案 0 :(得分:0)

继承在很多方面都可能很棘手 - 所以我的建议是用它来“轻松”。

但是在这里做一个典型的OO设计将产生可用的表格,结构。也许这样的事情对你有用......

public class Document
{
    public long ID { get; set; }
    public string Name { get; set; }
}

public class OrderLinesDocument : Document
{
    public ICollection<OrderLine> OrderLines { get; set; }
}

public interface IVendorDocument
{
    ICollection<Vendor> Vendors { get; set; }
}
public class VendorDocument : Document, IVendorDocument
{
    public ICollection<Vendor> Vendors { get; set; }
}

public interface ICustomerDocument
{
    ICollection<Customer> Customers { get; set; }
}
public class CustomerDocument : Document
{
    public ICollection<Customer> Customers { get; set; }
}

public class PurchaseOrder : OrderLinesDocument, IVendorDocument
{
    public ICollection<Vendor> Vendors { get; set; }
}

public class Invoice : Document, ICustomerDocument
{
    public ICollection<Customer> Customers { get; set; }
}

最简单的解决方案IMO正在使用TPH(就像'原样'一样)。

但正如我所说的那样,小心一点 - 它可能不适用于您的想法 - 即您需要进行实验,确保Db记录看起来最佳。

btw。如果您不知道,可以像这样使用它,忘了发帖...

var query1 = db.Documents.OfType<PurchaseOrder>().ToList();
var query2 = db.Documents.OfType<Invoice>().ToList();

var query3 = db.Documents.OfType<CustomerDocument>().ToList();
var query4 = db.Documents.OfType<VendorDocument>().ToList();
var query5 = db.Documents.OfType<OrderLinesDocument>().ToList();

var query6 = db.Documents.OfType<Document>().ToList();

(尝试看看它是如何运作的)