我目前正在开始一个新项目来帮助投诉。我已经解决了所有领域等问题。但在这样做的过程中,我意识到我需要超过一种类型的投诉。它们是客户投诉,供应商投诉或缺陷投诉。它们共享许多相同的字段但略有不同,所以我不确定如何在SQL Server数据库和/或使用EF中设计它。该应用程序将是一个使用C#的ASP.NET MVC 4应用程序,所以我可以利用Code First,但正如我所说的,我不确定我是如何设计这些实体的:
所有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)
所以我的问题是:
由于
注意:有更多列(ID等等)但我已经缩短了这个例子。
答案 0 :(得分:2)
在Code First中有几种方法可以实现继承,这完全取决于您希望SQL在SQL中表示的方式。
您是否需要针对所有类型的单个投诉表,其中某些字段根据其类型保留为空?你可以使用Table Per Hierarchy。
你想要一个包含公共字段的主投诉表,然后是基于类的保存额外列的关系表吗?你可以使用Table per Type。
如果您希望每种投诉类型都有一个表格,每个表格中都会显示公共字段?那是Table per Concrete Type
就个人而言,我可能会倾向于每种类型的Table。这是一个缩短的例子:
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; }
}
答案 1 :(得分:1)
是的,通常EF Code First策略是最佳选择。
您应该创建一个Complaint
类,并将此类用于(委托)Supplier
,Customer
和Defect
类。继承层次结构可能会损害您的设计可扩展性。总是喜欢构图而不是继承。