0

いくつかのタイプ A、B、C、および X の間に次の関係があります。

A->B->X
|->C->X
|->X

ここで、新しい A をデータベースに追加し、それを B、C、および X の既存のインスタンスに関連付けるとします。

私がやっていることはこれです:

using (Context context = new Context())
{
  context.As.Attach(A);
  context.As.Add(A);
  context.SaveChanges();
}

動作しているように見えますが、Attach は通常、既存のインスタンスをアタッチするために使用されるため、よくわかりません。

この代替手段は機能しません。

using (Context context = new Context())
{
  context.Bs.Attach(A.B);
  context.Cs.Attach(A.C);
  context.As.Add(A);
  context.SaveChanges();
}

この場合、X が 2 回 (ABX と ACX) 接続され、エンティティ フレームワークが例外をスローするためです。

System.InvalidOperationException: 
An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.

私のソリューションを使用するのは理にかなっていますか、それともこれを行うためのより良い方法はありますか?

4

1 に答える 1

1

はい、あなたのソリューションは理にかなっています-グラフ全体を添付し、状態だけAに変更しましたAdded。次のように書き換えることもできます。

using (Context context = new Context())
{
  context.As.Attach(A);
  context.Entry(A).State = EntityState.Added;
  context.SaveChanges();
}

一部の複雑なシナリオでは、逆の順序で実行することも役立ちます。つまり、すべてを追加し、既存のすべてのアイテムの状態を変更します。

于 2012-08-01T08:33:38.507 に答える