4

私はEntityFrameworkを初めて使用し、CodeFirstを実践しています。私の問題は、モデルクラスを作成していて、そのクラスを他の2つのクラスから継承したいということです。たとえば、従業員には、名、ミドルネーム、姓などの個人情報があります。住所、電話番号、電子メールなどの連絡先情報もあります。学生にもこれらのプロパティがあります。 。これらの情報を2つの異なるクラスに分けた理由は、会社、学校、病院、倉庫などの個人情報がなくても、別のエンティティが連絡先情報を持つことができるためです。

サンプルコード:

public class ContactInfo
{
    public string Address { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
}
public class PersonalInfo
{
    public string Firstname { get; set; }
    public string Middlename { get; set; }
    public string Lastname { get; set; }
}
public class Employee : // This should be inheriting from PersonalInfo and ContactInfo
{
    public int EmployeeID { get; set; }
}
public class Supplier : ContactInfo // Inheriting from ContactInfo and no PersonalInfo
{
    public int SupplierID { get; set; }
    public string Name { get; set; }
}

私がやりたかったのは、次のようになるように、Employeeによって継承されるインターフェイス(IPersonalInfo、IContactInfo)を作成することです。

public class Employee : IPersonalInfo,IContactInfo
{
    public int EmployeeID { get; set; }
}

これは良い習慣ですか?そうでない場合、この種のシナリオでどのように管理できますか?

4

2 に答える 2

17

まず第一に、あなたは継承と構成を混乱させているように聞こえます。継承の例としては、従業員または学生を継承できる共通のPerson基本クラスがあります。構成の例は、それぞれが共通のContactInfoオブジェクトで構成されているが、共通の基本クラスを持たないEmployeeとSupplierです。

エンティティを設計するときは、実際には、基盤となるリレーショナルデータベースのテーブル構造を設計しています。継承をモデル化できます。共通の基本クラスは、独自のテーブルと任意の共通フィールドで表すことができ、特殊なクラスは、共通テーブルにリンクする外部キーを使用して独自のテーブルに含めることができます。これを行うのは理にかなっている場合とそうでない場合があります。物事を別々のテーブルに分割することで、クエリに別の結合を追加します。これにより、パフォーマンスが低下します。

構成はリレーショナルデータベースで表すこともできますが、それが他の多くのデータエンティティ間で共有される共通のコンポーネントである場合にのみ実際に意味があります。ContactInfoは、ほとんどの場合、特定の人/サプライヤーに対して一意であるため、別のテーブルに分割することは実際には意味がありません。テーブル結合を追加するだけで、パフォーマンスが低下します。あなたのクエリ。

継承/構成をデザインの1つのレイヤーに移動することを検討する必要があります。エンティティ(データアクセス層)はリレーショナルデータベースと一致する必要がありますが、ドメインモデル(つまりビジネスオブジェクト層)はオブジェクト指向の原則に従う必要があります。

于 2013-01-26T06:13:47.473 に答える
3

はい、モデルで継承を定義する必要があります。その後、必ず1対多の関係を定義してください。こちらのリンク、良いチュートリアルを参照してください。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

于 2013-01-26T01:44:58.613 に答える