EF CTP5コードを使用-最初に、あるクラスに複数のコレクションを含み、別のクラスを指すクラスモデルをマッピングしようとしています。これが私が意味することの例です:
public class Company
{
public int CompanyId { get; set; }
public IList<Person> FemaleEmployees { get; set; }
public IList<Person> MaleEmployees { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public Company Company { get; set; }
}
DbContext
次のように、さらにカスタマイズせずにこのモデルからデータベースを作成させると、次のようになります。
public class MyContext : DbContext
{
public DbSet<Company> Companies { get; set; }
public DbSet<Person> People { get; set; }
}
...次に、SQL Serverに2つのテーブルがあります。1つの列Companies
のみの単純なテーブルと次の列のテーブルです(「FKRN」は、SQL ServerのEFによって作成された「外部キー関係名」を意味します)。CompanyId
People
PersonId int not nullable
CompanyCompanyId int nullable FKRN: Company_FemaleEmployees
CompanyCompanyId1 int nullable FKRN: Company_MaleEmployees
CompanyCompanyId2 int nullable FKRN: Person_Company
CompanyId
最後の3つの列には、テーブルの主キーとのすべての外部キー関係がありCompanies
ます。
今、私はいくつかの質問があります:
1)テーブルに3つの外部キー列があるのはなぜですか?
People
私は実際に2つを期待していました。3番目の列public Company Company { get; set; }
からプロパティを削除すると消えますが、クラスの参照プロパティも失われます。Person
CompanyCompanyId2
Company
2)プロパティをテーブルから削除したとしPerson
ます(モデルでは実際には必要ありません)。CompanyCompanyId
残りの2つの外部キー列に自動作成およびとは別の名前を付ける方法はありCompanyCompanyId1
ますか?(たとえば、FCompanyId
およびコレクションとMCompanyId
の関係を示すために。)FemaleEmployees
MaleEmployees
CompanyId
3)テーブルに1つの外部キーのみを使用してこのモデルを定義する方法はありPeople
ますか?確かに、Person
クラス内に差別化する追加の列が必要になります(のようにbool IsFemale
)。PersonはFemaleEmployees
またはMaleEmployees
コレクションのいずれかであり、両方に含まれることはありません(この例では当然)。したがって、SQLを使用すると、のようなものでこれらのコレクションをフェッチできますWHERE IsFemale = true/false AND CompanyId = 1
。この方法で2つのコレクションをロードするためのヒントをEntityFrameworkに与えることができるかどうか疑問に思っています。(ここでは、両方が派生するaFemalePerson
とclassによってモデルを拡張することは避けたいと思います。MalePerson
Person
これらの派生クラスは空で人工的であり、SQL Serverへのマッピングを有効にする以外の目的はなかったため、基本クラスとして使用し、たとえばTable-Per-Hierarchyマッピングを使用します。)外部キーCompanyId
が1つしかない場合は、それを作成できnon-nullable
ます。 2つの外部キーでは不可能です(同じ行で両方がnull以外になることはありません)。
事前にフィードバックや提案をありがとうございます!