1

次の 2 つのエンティティがあるとします。

Item
 int Id
 ICollection<ChildItem> ChildItems

ChildItem
 int Id
 Item ParentItem

(削除時のカスケードは、EF デザイナーと SQL サーバーの両方で Item から ChildItem に設定されます)、次のようなコードがあります。

Item newItem = new Item();
ChildItem child1 = new ChildItem();
ChildItem child2 = new ChildItem();
newItem.ChildItems.Add(child1);
newItem.ChildItems.Add(child2);
myContext.Items.AddObject(newItem);
// Then much, much further down the line
myContext.Items.DeleteObject(newItem);

さて、EF は子項目も削除する必要があることを自動的に判断しますか、それとも自分で削除する必要がありますか?

問題は、DeleteObject の前に SaveChanges() を追加すると削除コードが正常に機能することですが、最初に削除しようとすると、変更を保存すると、「関連付けのプリンシパル エンドを特定できません」という例外が発生する傾向があります。 . これは、私が EF 4 でこのようなことを試みているということです。

4

1 に答える 1

1

newItemtoの状態を変更するUnchangedとうまくいくかもしれません。

しかし、私は別のアプローチを取るでしょう。どうやら、どの新しいアイテムが最終的にデータベースにコミットされるかを決定するプロセスにいるようです。これらのアイテムの単純なローカルList<T>を使用し、最初はこのリストにアイテムを追加/削除するだけです。最後に、すべてが整理されたら、残りの項目を に追加してmyContext.Items変更を保存します。また、変更トラッカーのビジー状態が緩和されるため、オーバーヘッドも削減されます。

于 2013-04-03T11:27:07.787 に答える