2011-07-22 14 views
1

をモデル化するためにEF 4.1を設定するにはどうすればよい:私が正しく、私は不変である以下のモデル持っている非標準の関係

Person 
------- 
int Id (PK) 
int CompanyId 
bool Deleted 

Company 
------- 
int Id (PK) 
int DefaultIdentifierId 

Identifier 
------- 
int PersonId (PK) 
int DefaultIdentifierId (PK) 
string Identifier 

を、私は各テーブル用のクラスを作成しましたが、私はへのマッピングを指定するのに苦労していますデータベースを正しく私は会社idとIdentiferを与えられた非削除人のIDを返すことができる必要があります。 sqlのこれは、DefaultIdentifierIdを介してCompanyとIdentiferとの間の結合であり、PersonIdを介したPersonとIdentifier間の結合ですが、これを正しく指定することはできません。

+0

あなたは何を試しましたか?とにかく、* code-first *の考え方は*クラス*を最初に作成し、EFはいくつかの規則とオーバーライドを使用して簡単に新しいDBにマップします。レガシーDBのマッピングにはあまり適していません。 –

答えて

0

問題がIdentifierでもないCompanyDefaultIdentifierIdDefaultIdentifierIdが主キーであるため、あなたがCompanyIdentifier間のナビゲーションプロパティを持つことができないということです。 (Identifierでは、それはキーの一部に過ぎません)CompanyPersonの間、そしてPersonIdentifierの間の1対多の関係をモデル化できます。ですから、これらのモデルクラスを試みることができる:

public class Person 
{ 
    public int Id { get; set; } 
    public int CompanyId { get; set; } 
    public Company Company { get; set; } 
    public bool Deleted { get; set; } 
} 

public class Company 
{ 
    public int Id { get; set; } 
    public int DefaultIdentifierId { get; set; } 
} 

public class Identifier 
{ 
    [Key, Column(Order = 1)] 
    public int PersonId { get; set; } 
    [Key, Column(Order = 2)] 
    public int DefaultIdentifierId { get; set; } 
    public string IdentifierString { get; set; } 

    public Person Person { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 
    public DbSet<Company> Companies { get; set; } 
    public DbSet<Identifier> Identifiers { get; set; } 
} 

同上Companyの名前DefaultIdentifierIdで誤解を招く恐れがあります。このモデルでは、このプロパティは単純なスカラープロパティであり、任意のナビゲーションプロパティに属する外部キープロパティではありません。

int companyId = 1; 
string identifierString = "ABC"; 

List<int> personIds = context.Identifiers 
    .Join(context.Companies, 
      i => i.DefaultIdentifierId, 
      c => c.DefaultIdentifierId, 
      (i, c) => new { i, c }) 
    .Where(a => a.c.Id == companyId 
      && a.i.IdentifierString == identifierString 
      && !a.i.Person.Deleted) 
    .Select(a => a.i.Person.Id) // or a.i.PersonId should work as well 
    .ToList(); 

結果は必ずしもユニークものの者IDのリストではありません:あなたはあなたがナビゲーションプロパティを通じてCompanyからIdentifierに移動することはできませんので、LINQでJoinを使用する必要がありますするクエリを実行するには

関連する問題