人はクライアントと顧客の両方になることができます。
その後Client
、Customer
から継承することはできませんPerson
。これを構成でモデル化する必要があります。Not : APerson
は Client
またはCustomer
です。代わりに: APerson
にはClient
、および/またはの属性がありますCustomer
。
EF では、これは 2 つの 1 対 1 の関係になります。
public class Person
{
public int PersonId { get; set; }
public Client Client { get; set; }
public Customer Customer { get; set; }
}
Client
を参照する参照Customer
を持つことができます。(この参照を持つ必要はありませんが、このナビゲーション プロパティを介して FirstName と LastName へのアクセスを有効にすることは理にかなっています。)Person
Person
public class Client / Customer
{
public int PersonId { get; set; }
public Person Person { get; set; }
}
Person は常にaと属性の両方を持つ必要はないと思いますが、場合によっては 1 つだけ (または 0 でさえありますか?) 必要があります。この場合、は両方のリレーションシップのプリンシパルであり、/は依存関係です。Fluent API を使用すると、次のようにモデル化されます。Client
Customer
Person
Client
Customer
Person
Person
Client
Customer
modelBuilder.Entity<Person>()
.HasOptional(p => p.Client)
.WithRequired(c => c.Person);
modelBuilder.Entity<Person>()
.HasOptional(p => p.Customer)
.WithRequired(c => c.Person);
と の関係はPerson
、Note
2 つの通常の 1 対多の関係です。Person
2 つのナビゲーション コレクションを持つことができます...
public ICollection<Note> NotesAsNotator { get; set; }
public ICollection<Note> NotesAsNotatee { get; set; }
...そして、2 つの外部キー プロパティと共にNote
2 つの参照を持つことができます (これらはモデルで公開する必要はありませんが、しばしば役立ちます)。Person
public int NotatorIDFK { get; set; }
public Person Notator { get; set; }
public int NotateeIDFK { get; set; }
public Person Notatee { get; set; }
そして、関係は次のように Fluent API で定義されます。
modelBuilder.Entity<Person>()
.HasMany(p => p.NotesAsNotator)
.WithRequired(n => n.Notator)
.HasForeignKey(n => n.NotatorIDFK)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Person>()
.HasMany(p => p.NotesAsNotatee)
.WithRequired(n => n.Notatee)
.HasForeignKey(n => n.NotateeIDFK)
.WillCascadeOnDelete(false);
カスケード削除はここで (少なくとも 2 つのリレーションシップの 1 つに対して) 無効にする必要があります。そうしないと、少なくとも SQL Server では禁止されている 2 つのリレーションシップのために、複数のカスケード削除パスを介してPerson
削除できます。Notes
Location
と とClient
と の間の関係もLocation
、Customer
それぞれ 2 つの 1 対多の関係 (合計 4 つ) であり、 に 4 つのコレクションがLocation
あり、 と に 2 つの参照Location
がClient
ありCustomer
ます。これらは、上記の関係と同様にモデル化されています。
Client
とEmail
との関係は 1 対 1 ですが、明らかにEF でサポートされていない外部キー (一意のキー制約付き?) を使用しCustomer
ているため、問題です。コメントで Gert Arnold が既に質問したように: なぜとの関係がないのですか? この 2 つの関係は、ある人が顧客としてではなく顧客として別の電子メール アドレスを持つことができることを表しているのでしょうか? モデルのこの部分がわかりません。Email
PersonIDFK
Person
Email