2012-09-05 55 views
0

我現在要開始一個新項目來幫助投訴。我已經制定了所有的領域等。但在這樣做的時候,我意識到我需要超過1種類型的投訴。他們是客戶投訴,供應商投訴或缺陷投訴。他們共享許多相同的字段,但略有不同,所以我不確定我將如何在SQL Server數據庫和/或使用EF中進行設計。該應用程序將是一個使用C#的ASP.NET MVC 4應用程序,所以我可以利用Code First,但正如我所說的,我不確定我將如何設計這些實體:SQL Server/EF - 數據庫設計

所有3種投訴類型共享以下欄目:

ComplaintType (int), Department (int), 
Code (int), DefectReference (string), Cause (int) 

客戶投訴和供應商的投訴份額這些列:

ComplaintText (string), Orders (collection), Rectification (string) 

這裏有獨特的客戶投訴列:

AccountNumber (string), CustomerName (string) 

最後,這裏是唯一的供應商投訴領域:

SupplierNumber (string), SupplierName (string) 

所以我的問題是:

  1. 我將如何處理這一創建我的模型使用EF代碼優先使用或
  2. 我如何使用SQL Server設計這個?

感謝

注:有更多的列(ID的等),但我已經縮短了它的這個例子。

+0

這取決於您是否將從域對象或數據庫表建模應用程序。 –

回答

2

在Code First中實現繼承的方法有幾種,這一切都取決於您希望如何在SQL中表示表。

你想要一個單一的投訴表的所有類型,其中一些字段留空爲基於它是什麼類型?你會爲此使用Table Per Hierarchy

你想要一個主要的投訴表,它包含公共字段,然後是基於類的保存額外列的關係表?你會爲此使用Table per Type

如果您希望每個投訴類型都有一個表,並且每個表中都有通用字段?這是Table per Concrete Type

就個人而言,與你有我可能傾向於每類型表。這裏有一個簡短的例子:

public abstract class Complaint 
{ 
    public int ComplaintType { get; set; } 
    public int Department { get; set; } 
    public int Code { get; set; } 
} 

[Table("CustomerComplaint")] 
public class BankAccount : Complaint 
{ 
    public string ComplaintText { get; set; } 
    public string Rectification { get; set; } 
} 

[Table("SupplierComplaint")] 
public class SupplierComplaint: Complaint 
{ 
    public string SupplierNumber { get; set; } 
    public string SupplierName { get; set; } 
} 
+0

這是一個很好的答案!謝謝,我會看看不同的類型,看看最好的! – CallumVass

+0

對此,在我的DbContext類中,是否必須爲每個表創建一個DbSet?所以,在你的例子中:'Complaint','BankAccount','SupplierComplaint' – CallumVass

1

是的,通常EF Code First策略是最佳選擇。

您應該創建一個Complaint類,並使用(委託)此類到Supplier,CustomerDefect類。繼承層次結構可能會損害您的設計可擴展性。始終偏愛合成而不是繼承。

+0

你的意思是構成而不是繼承?例? – CallumVass

+1

http:// stackoverflow。com/questions/49002/prefer-composition-over-inheritance –