私は個人的に EF 4.1 の流暢な API を使用してすべてのエンティティを構成していますが、既定の規則では理解できないと感じたので、流暢な API を使用して回答します。
モデルを設定する方法は次のとおりです。
public class Member
{
public Member()
{
AuthenticationTokens = new List<AuthenticationToken>();
}
public int MemberId { get; set; }
public virtual Email PrimaryEmail { get; set; }
public virtual ICollection<AuthenticationToken> AuthenticationTokens { get; set; }
}
public class AuthenticationToken
{
public int AuthenticationTokenId { get; set; }
public virtual Email Email { get; set; }
}
public class Email
{
public int EmailId { get; set; }
}
そして、これは私のコンテキストと流暢な構成です:
public class ExampleApplicationContext : DbContext
{
public ExampleApplicationContext()
: base("ExampleApplicationConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// No cascade on delete because the primary email may be held by an authentication token.
modelBuilder.Entity<Member>()
.HasOptional(x => x.PrimaryEmail)
.WithOptionalDependent()
.Map(x =>
{
x.MapKey("EmailId");
})
.WillCascadeOnDelete(false);
// Cascade on delete because an authentication token not associated with a Member makes no sense.
modelBuilder.Entity<Member>()
.HasMany(x => x.AuthenticationTokens)
.WithRequired()
.Map(x =>
{
x.MapKey("MemberId");
})
.WillCascadeOnDelete();
// No cascade on delete because an email may be held by a Member.
modelBuilder.Entity<AuthenticationToken>()
.HasOptional(x => x.Email)
.WithOptionalDependent()
.Map(x =>
{
x.MapKey("EmailId");
})
.WillCascadeOnDelete(false);
}
public DbSet<Member> Members { get; set; }
}
ここでは、なぜこのように設計したのかについて、私の推論を説明するために最善を尽くします。まず第一に、あなたのモデルMember
ではルート集約 (他のエンティティのボス) であるべきだと思われます。私が言いたいのは、Authentication Token
それが特定の に属していない限り意味がないということMember
です。また、 anは、 a に属しているか、または an にEmail
属していない限り、単独では意味がありません。このため、にはそれが何にアタッチされているかを調べるためのプロパティがありません(これを調べるには、そのコレクションを見るだけでなく、最初に and が必要です)。基本的に、すべてはオブジェクトを中心に展開します。がないと作成できません。そして aまたは anなしでは作成できません。Member
AuthenticationToken
AuthenticationToken
Member
Member
Member
Member
AuthenticationToken
Member
AuthenticationToken
Email
EF 4.1 の流暢な API にどれだけ慣れているかは完全にはわかりません。質問がある場合はコメントを残してください。できる限りお答えします。上記のモデルを構築および検証するために使用した小さなサンプル アプリケーションも含めました。プログラム (小さなコンソール アプリ) を実行する場合は、SQL Server のインスタンスを指すように App.config の接続文字列を変更するだけです。
私が懸念していることの 1 つは、 がaと an のEmail
両方に属することができるという事実です。私の懸念は、いくつかの興味深いカスケード削除をセットアップしなければならなかったという事実から来ています。ただし、すべての要件を把握しているわけではありません。このセットアップは問題なく機能しているように見えるため、問題にはならない可能性があります。Member
AuthenticationToken
コンソール アプリケーションの例