0

問い合わせを行う顧客がいる場合 (問い合わせは 1 回のみ許可されます)、次のことを行いますか?

public class Customer
{
    public string Name {get;set;}
    public string ContactNumber {get;set;}

    public virtual Inquiry Inquiry {get;set;}
}
public class Inquiry
{
    public string Product {get;set;}
    public string Information {get;set;}
    public string Reason {get;set;}
}

または私はこのように持っていますか:

public class Customer
{
    public string Name {get;set;}
    public string ContactNumber {get;set;}
}
public class Inquiry
{
    public string Product {get;set;}
    public string Information {get;set;}
    public string Reason {get;set;}

    public virtual Contact Contact {get;set;}
}

最初のシナリオでは、ナビゲーション プロパティと同様に使用しない限り、Inquiryが削除された場合も削除されると確信しています。このシナリオはより理にかなっています。Customerpublic Guid? InquiryId {get;set;}

Customer2 番目のシナリオでは、aが削除された場合Inquiry、望ましい効果であると確信しています。customer => inquiryただし、顧客が行った問い合わせではなく、顧客が行った問い合わせを確認する必要があるため、ナビゲーション プロパティが少し冗長になりますinquiry.FirstOrDefault(x => x.Customer.Id.Equals(customerId))

ある意味ではDelete On Cascadeプロパティは役立ちますが、ナビゲーション プロパティは冗長ですが、別の方法でDelete On Cascadeは役に立ちません (そして、それを有利に動作させるにはより多くのコードが必要です) が、ナビゲーション プロパティは役立ちます。

では、どのように進路を決めるのでしょうか。

最初のシナリオのもう1つの欠点は、関連するものを手動で削除する必要があることです。これは、カスケードInquiryを削除するCustomerとカスケードが無視されるためです(コードでオフになっているため)。

4

1 に答える 1

1

あなたの質問とあなたのコメントからの次の情報をまとめると...

  • 顧客からの問い合わせは 1 件です
  • 顧客が削除されたときに、関連する問い合わせも削除する必要があるという効果が望まれます
  • 顧客と問い合わせの関係が 1 対 1 またはゼロであることを期待している

... 2 つのモデルのどちらも、さらにマッピングを指定しない限り、これらの要件を満たすことはできません。ただし、最初のモデルを使用し、Fluent API で明示的なマッピングを追加することで、目標を達成できます。

modelBuilder.Entity<Customer>()
    .HasOptional(c => c.Inquiry)
    .WithRequired()
    .WillCascadeOnDelete(true);

関連CustomerInquiry、同じ主キー値を共有します。つまり、 の主キーInquiryは への外部キーCustomerです。

いくつかの誤った仮定についてのいくつかのコメント:

最初のシナリオでは、問い合わせが削除された場合、顧客も削除されると確信しています。

モデルに外部キー プロパティがないため、これは正しくありません。この場合、EF はオプションの関係を想定し、既定ではカスケード削除を有効にしません。

2 番目のシナリオでは、顧客が削除された場合、問い合わせも削除されると確信しています。

同じ理由で正しくありません。

それは 1 対 1 またはゼロ (関係) です。

最初のシナリオと 2 番目のシナリオはどちらも一対多の関係を表しています。これは、関係の片側にのみナビゲーション プロパティがある場合に EF が想定する既定の関係であるためです。反対側でコレクションを公開するか、1 対多の関係にしないかは問題ではありません。たとえば、最初のシナリオでは、2 人の顧客が同じ問い合わせを参照している可能性があります。これは、(概念的にもデータベースの観点からも) この問い合わせには 2 人の (=多くの) 顧客がいるということを意味します。

于 2013-08-25T13:16:25.653 に答える