2


0

ポリモーフィックな関連付けと分割テーブル

SQL Serverデータベースに3つのテーブルがあります。

  • 先生

  • 学生

これらの各テーブルには、他のテーブルにもあるいくつかの列が含まれています。例:

  • ファーストネーム

他のすべての列は異なります。 これはレガシーデータベースです。 変更できません

私のC#コードでは、次のものが必要です。

public partial class Person
{
    public string FirstName { get; set; }
    public string Surname { get; set; }

    public virtual ICollection Roles { get; set; }
}

public interface Role
{
}

public partial class Teacher : Role
{
    public string School { get; set; }
}

public partial class Student : Role
{
    public string YearLevel { get; set; }
}

public partial class Parent : Role
{
    public string Blagh { get; set; }
}

つまり、ロールと個人の間の多態的な多対1の関連付けです。

私がこれを望む理由は、人が教師と親の両方になれるからです。

私の質問は、データベースからビジネスオブジェクトを作成するためにどのテクノロジーを使用する必要があるかということです。

Entity Framework 4.1のDbContextを見てきました。私はデータ注釈アプローチが好きですが、それは私が望むことをすることができますか? そうでない場合、Fluent APIを使用できますか?

Entity Frameworkでこれができない場合、NHibernate(できれば属性を使用)またはLinq-to-SQLはどうですか?

NHibernateがポリモーフィックな関連付けを処理できることは知っていますが、これは、次のようにエンティティ間でテーブルを分割する場合に実行できますか?

1 回答


2


Entityフレームワークで最も近いものはhttp://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3です。 -table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx [TPC継承]:

public abstract class Person
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

public partial class Teacher : Person
{
    public string School { get; set; }
}

public partial class Student : Person
{
    public string YearLevel { get; set; }
}

public partial class Parent : Person
{
    public string Blagh { get; set; }
}

これ以上何もありません:

  • EFは、複数のエンティティを同じテーブルにマッピングすることができません。 継承またはテーブル分割

  • EFは複数のリレーションを単一のナビゲーションプロパティにマッピングできません

  • 教師と保護者は常に2つの異なる関係者ではありません。

NHibernateがこれをサポートしているとは思えません。なぜなら、あなたが示したのは純粋なポリモーフィックな関連付けではないからです(Personの非決定論的マッピングにはまだ問題があります)。