2013-04-08 41 views
3

我想弄清楚如何處理多種類型的繼承。我有一個現有的Code First/EF/MVC項目,它在生產環境中具有實時數據。系統使用稱爲「文檔」的類型,可以在其上執行許多功能,並且有許多關聯的表可以鏈接到DocumentID。EF代碼冷杉中的多繼承級別

目前隨着越來越多的差異化類型的文檔,採購訂單,它實現了一些更具體的屬性,如「OrderLines」,它引用一個產品,數量和單價的集合。還有其他一些特定於採購訂單的字段。除了具有「OrderLines」的基礎憑證類型之外,採購訂單是供應方憑證,因此它的第三方是「供應商」。可能還有其他的供應方文件在將來也有供應商作爲第三方。

我現在準備實施新的文檔類型,這將是需求方,這意味着將有一個第三方稱爲客戶。它也有一個OrderLines的集合。

我的系統目前設置爲TPH,所以表稱爲「文檔」,有一個鑑別列,指出該文件裏面是採購訂單。

我如何可以添加新的類型和使用繼承來實現OrderLines收集和在客戶/客戶鏈接?看來,C#不能做多重繼承,所以下面就出了問題:

文檔 - > OrderLinesDocument - > PurchaseOrder的

文檔 - > OrderLinesDocument - >發票

文檔 - > VendorDocument - >的PurchaseOrder

文獻 - > CustomerDocument - >發票

WHE中產階級是否會實施對許多文件可能是共同的領域,但不是所有文件?

有沒有辦法做到這一點使用接口,而且還有EF弄清楚正確的表?

+0

我編輯了自己的冠軍。請參閱,「[應該問題包括在他們的標題」標籤「?](http://meta.stackexchange.com/questions/19190/)「,其中的共識是」不,他們不應該「 – 2013-04-09 01:01:06

+0

它應該是'First' @JohnSaunders :)) – NSGaga 2013-04-09 01:45:56

回答

0

繼承在許多方面可能會非常棘手 - 所以我的建議是「輕鬆」。

但是在這裏做一個典型的面向對象設計將產生可用的表格,結構。也許這樣的事情可以爲你...

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; } 
} 

最簡單的解決方案國際海事組織正在使用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(); 

(試試,看看它是如何工作)

+0

該解決方案是否可以與外來在接口中的關鍵屬性?它是公共虛擬供應商供應商{get; set;}和[ForeignKey(「Vendor」)] public int?VendorID {get; set;}。函數在派生類中驗證和特定於每個文檔類型 – 2013-04-09 00:51:48

+0

理想情況下它應該 - 接口在這裏不是'入侵式' - '類'是(類會影響表的創建方式) - 接口只能用於你可以相應地訪問所有東西,所以你可以放入所有你想要的接口,但問題在於實現它的類,我不能告訴你,因爲每種情況都不一樣,你總是可以破壞它。佈局,制定細節和遇到麻煩時然後想想如何避免它。沒有一般規則 - 但要注意「週期性」路徑,邏輯關係等。 – NSGaga 2013-04-09 00:55:04

+0

這是@YHaber的工作嗎? – NSGaga 2013-04-11 19:51:35