4

問題: オブジェクト「注文」を dbcontext に追加すると、注文のネストされたすべてのオブジェクトがデータベースに「再追加」されますが、ネストされたオブジェクトは静的データであり、参照のみをデータベースに追加する必要があります。

例: データベースには 0 件の注文と 3 件のアイテムが保持されています。

2つの商品で1つの注文を追加します。

これで、データベースには 1 つの注文と 5 つのアイテムが保持されます。アイテムが db.SaveChanges() の前に正しい主キーを持っていたとしても、順序の 2 つのアイテムはデータベースに「再追加」されています。

変更を保存する前に、既存のアイテムを dbcontext にアタッチできる場合があることは理解していますが、それが本当に唯一の方法ですか? 主キーが既存のアイテムと一致する場合、EF は to アイテムが既に存在することを理解できませんか?

これがEF CodeFirstの新しいバージョンで異なるかどうかは誰にも分かりますか?

4

1 に答える 1

5

エンティティが既存のものか新しいものかを EF が判断できない- Add コマンドと Attach コマンドの両方がグラフ指向の操作です。グラフ内の 1 つのエンティティでそれらを呼び出すと、すべての関係 (およびそれらの関係など) を走査し、それらの操作も実行します。

たとえば、以下を使用して、グラフ内の各エンティティの正しい状態を把握する必要があります。

dbContext.Orders.Add(newOrder);
foreach(var item in newOrder.Items) {
    dbContext.Entry(item).State = EntityState.Unchanged;
}
dbContext.SaveChanges();

呼び出すことで逆の操作を使用し、状態Attach(newOrder)に順序を設定できますAdded。主な違いは、独立した関連付け(多対多の関係など) にあります。最初のアプローチでは注文と各アイテムの間に新しい関係が正しく追加されますが、2 番目のアプローチでは各関係をAdded状態に手動で設定しない限り追加されません (関係の状態の変更はより複雑です)。

于 2012-09-10T20:24:15.307 に答える