2011-07-26 10 views
1

コードに最初にマップするかなり複雑なデータベースがありますが、2つの別々のクラスに分割する必要があるテーブルに問題があります。次のようにEFコード複数のクラスを1つのテーブルに最初にマッピングする

テーブル構造の基本的な例は次のとおりです。

Site 
---- 
Id 
Name 

Person 
------ 
Id 
Name 
Dob 
Address 
Rank 
Age 
SiteId 

PersonRoleLink 
-------------- 
PersonId 
RoleId 

Role 
---- 
Id 
Name 

は基本的にサイトには多くの人々を持っており、それぞれの人が多くの役割を持つことができます。

人物の役割に応じて、入力されるプロパティに応じて異なります。

次のように理想的には、私はクラスの構造をしたいと思います:

CustomerEmployeeManagerはすべて Personテーブルから来て、 PersonRoleLinkテーブルに関連するリンクに依存している
public class Site { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Customer> Customers { get; set; } 
    public virtual ICollection<Employee> Employees { get; set; } 
    public virtual ICollection<Manager> Managers { get; set; } 
} 

public class PersonBase { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual Site Site { get; set; } 
} 

public class Customer : PersonBase { 
    public string Name { get; set; } 
    public DateTime Dob { get; set; } 
} 

public class Employee: PersonBase { 
    public int Age { get; set; } 
} 

public class Manager: PersonBase { 
    public int Rank { get; set; } 
} 

を。

だから私は戻っPersonテーブルにSite.Managers行のようなものを呼び出すときに正しいサイトIDを持つと「マネージャー」

呼ばRoleへのリンクを持つものは、最初のコードでは、この構造は可能ですがありますか?もしそうなら、これに対するマッピングはどのように達成されていますか?もしそうでなければ、この構造に実行可能な代替手段はありますか?

おかげ

答えて

1

それはデータ駆動型マッピング及びEFコードが最初の唯一の例外を除いて、それをサポートしていないので、それがEFでは不可能である。マッピングされたテーブル内の単一の列の値をマッピング異なることが階層継承マッピングあたり表サブエンティティ。あなたの場合、エンティティの種類が異なる値は2つの関係から離れています。さらに、personテーブルからの1つのレコードは、複数のエンティティインスタンスを表すことができます。これは別の問題です。これらのインスタンスには一意のキーがなく、EFはそれを実行できません。

一般的にあなたの従業員とマネージャーは一人の人間を持つことができるので、想定されるオブジェクトモデルは間違っています。 2つの異なる "Person"オブジェクトが生成されるべきではありません。ユーザーPersonは、ナビゲーションプロパティをロールに直接割り当て、ヘルパーメソッドを作成してマネージャ、従業員および顧客を取得します。

+0

偉大な答え、ありがとう。 – lancscoder