3

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

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

我现在准备实施一种新的文档类型,即需求方,这意味着它将有一个称为客户的第三方。它还有一个 OrderLines 集合。

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

如何添加新类型并使用继承来实现 OrderLines 集合和 CustomerID / Customer 链接?看来 c# 不能做多重继承,所以下面的问题是不可能的:

Document -> OrderLinesDocument -> PurchaseOrder

文档 -> OrderLinesDocument -> 发票

Document -> VendorDocument -> PurchaseOrder

单据 -> 客户单据 -> 发票

中产阶级将在哪里实现可能对许多文档但不是所有文档共有的字段?

有没有办法使用接口来实现这一点,并且仍然让 EF 正确地找出表格?

4

1 回答 1

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 记录看起来是最佳的。

顺便提一句。如果你不知道,你可以这样使用它,忘记发布......

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();

(试试看它是如何工作的)

于 2013-04-08T23:56:03.220 回答