問題がIdentifier
でもないCompany
でDefaultIdentifierId
もDefaultIdentifierId
が主キーであるため、あなたがCompany
とIdentifier
間のナビゲーションプロパティを持つことができないということです。 (Identifier
では、それはキーの一部に過ぎません)Company
とPerson
の間、そしてPerson
とIdentifier
の間の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
を使用する必要がありますするクエリを実行するには
。
あなたは何を試しましたか?とにかく、* code-first *の考え方は*クラス*を最初に作成し、EFはいくつかの規則とオーバーライドを使用して簡単に新しいDBにマップします。レガシーDBのマッピングにはあまり適していません。 –