0

私は鶏と卵の問題がありますが、それは自明なので、すべての主キーがアイデンティティフィールドである集約ルートを保存するための通常のパターンは何かを尋ねると思いました。Entity Framework 4.1:複数のテーブルを含むデータコンテキストから1つのテーブルを保存することは可能ですか?

私は典型的な接触エンティティを持っている:

両方のアドレスがアドレステーブルに格納されており、唯一の主キーがIDフィールドです
Customer { 
     HomeAddress { 
     } 
     WorkAddress { 
     } 
} 

。すべてのフィールドを照合して、一意のアドレスレコードを保持します。ここで

が問題だ:私は外部キーをフックアップするためのアドレス識別フィールドを取得する必要が

  1. ので、私はそうでない場合、私は、既存のことを読み込み、それはユニークだ場合にのみ、お客様の記録を保存する前にアドレスレコードを保存します住所。
  2. アドレスが顧客と同じDCにある場合、顧客はあまりに早く保存します(すべてのレコードが設定されているわけではありません)。
  3. アドレスが別のDCにある場合、アドレスは別のDCにあります。 2つのDCに関連付けられたエンティティを持つことはできません(1つで開くことはできません。次に別のものに保存してください)。

したがって、私はすべてのアドレスに対して別々のリポジトリが必要であり、もう一方のDCのアドレスに戻り、同じ情報のためにデータベースに冗長呼び出しを行います。

Entity Framework 4.1のデータコンテキスト/コンテナにレコードを部分的に保存する方法はありますか?たとえば、同じDC内にあるときにアドレスを単独で保存するにはどうすればよいですか?

答えて

1

あなたの大胆な質問に対する答えは、私が理解できる限り「いいえ」です。コンテキストは作業単位であり、SaveChangesは、すべての新規、変更、または削除されたオブジェクトを1回のトランザクションでデータベースにコミットします。このオブジェクトまたはそのオブジェクトのみを保存するか、または状態のエンティティのみを保存し、状態ModifiedまたはDeletedなどのエンティティをコミットしないでください。

回避策として、あなたはそれを試みることができる:

using (var context1 = new MyContext()) 
{ 
    Address address = context1.Addresses.Where(predicate).FirstOrDefault(); 
    // if address != null it is attached now to context1 
    if (address == null) 
    { 
     // ... otherwise create new address in another context and save 
     using (var context2 = new MyContext()) 
     { 
      address = new Address { Name = name, ... } 
      context2.Addresses.Add(address); 
      context2.SaveChanges(); 
     } // context2 destroyed now and address is not attached to it anymore 
     // ... and attach to context1 
     context1.Addresses.Attach(address); 
    } 

    customer.HomeAddress = address; 

    // ... 

    context1.SaveChanges(); 
} 

この方法addressは、同時に2つのコンテキストに添付されることはありません。これがうまくいくかどうかわかりません。

編集

「通常」あなたは一人でcontext1でこのすべてを行うことができること(私の上記のコードはとても奇妙に見えるので)私は追加する必要があります。しかし、私はあなたのポイント2をこのように理解しています。SaveChangesの前に// ...(これはわかりません)に何か起こっていることがあり、新しいアドレスと顧客を同時に保存できません。

関連する問題