SQL Server / EF - 数据库设计

时间:2012-09-05 16:25:24

标签: sql-server asp.net-mvc entity-framework

我目前正在开始一个新项目来帮助投诉。我已经解决了所有领域等问题。但在这样做的过程中,我意识到我需要超过一种类型的投诉。它们是客户投诉,供应商投诉或缺陷投诉。它们共享许多相同的字段但略有不同,所以我不确定如何在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)

所以我的问题是:

  1. 如何创建我的模型以与EF Code First或
  2. 一起使用
  3. 我如何使用SQL Server进行设计?
  4. 由于

    注意:有更多列(ID等等)但我已经缩短了这个例子。

2 个答案:

答案 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类,并将此类用于(委托)SupplierCustomerDefect类。继承层次结构可能会损害您的设计可扩展性。总是喜欢构图而不是继承。