0

私は現在、苦情を支援するための新しいプロジェクトを開始する予定です。私はすべてのフィールドなどを解決しました..しかし、そうすることで、複数のタイプの苦情が必要であることに気付きました. それらは、顧客の苦情、サプライヤーの苦情、または欠陥の苦情です。それらは多くの同じフィールドを共有していますが、わずかに異なるため、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 または EF Code First で使用するモデルを作成するには、どのようにアプローチしますか
  2. SQL Server を使用してこれをどのように設計しますか?

ありがとう

注: 他にも列 (ID など) がありますが、この例では短くしています。

4

2 に答える 2

2

Code First で継承を実装する方法はいくつかありますが、それはすべて SQL でテーブルをどのように表現するかによって異なります。

タイプに基づいて一部のフィールドが null のままになっている、すべてのタイプに対して単一の苦情テーブルが必要ですか? そのためには、 Table Per Hierarchyを使用します。

クラスに基づいて、共通フィールドを格納する主な苦情テーブルと、追加の列を保持するリレーショナル テーブルが必要ですか? そのためには、 Type per Typeを使用します。

苦情の種類ごとに 1 つのテーブルが必要な場合は、すべてのテーブルで共通のフィールドを表現しますか? それは具体的なタイプごとの表です

個人的には、あなたが持っているもので、おそらくタイプごとのテーブルに傾倒するでしょう. 短縮された例を次に示します。

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; }
}
于 2012-09-05T16:35:21.280 に答える
1

はい、一般的には EF Code First 戦略が最適なオプションです。

クラスを作成し、ComplaintこのクラスをSupplierCustomerおよびDefectクラスに使用 (委譲) する必要があります。継承階層は、設計の拡張性を損なう可能性があります。常に継承よりも合成を優先してください。

于 2012-09-05T16:35:03.727 に答える