私のアプリケーションでは、DbContext
HTTP リクエストごとに新しいインスタンスを取得しています。通常のワークフローでは、エンティティを作成し、そのナビゲーション プロパティの一部の入力を開始します。
// Request 1
var foo = new Foo();
SessionStore.Add("Foo", foo);
// Request 2
var bar = BarDataService.GetBar(barId);
var foo = SessionStore.Get<Foo>("Foo");
foo.Bars.Add(bar);
// Request 3
var baz = BazDataService.GetBaz(bazId);
var foo = SessionStore.Get<Foo>("Foo");
foo.Baz = baz;
オブジェクト グラフが完全に読み込まれたら、エンティティをデータベースに挿入します。
var foo = SessionStore.Get<Foo>("Foo");
FooDataService.Add(foo); // BOOM!
Add は通常、エンティティを に追加するだけで、DbSet
変更の保存を呼び出します。
Set.Add(entity);
Context.SaveChanges();
foo
オブジェクトに複数のプロキシ オブジェクトが含まれており、それぞれが異なる にアタッチされているため、明らかにこれは失敗しますDbContexts
。私たちが決定した解決策は、受け取っていたオブジェクトをデタッチすることでした:
// Request 2 (modified)
var bar = BarDataService.GetBar(barId);
BarDataService.Detach(bar);
foo.Bars.Add(bar);
// Similar code for Request 3
var foo = SessionStore.Get<Foo>("Foo");
FooDataService.Add(foo); // Works
とオブジェクトの新しいインスタンスが作成されるという事実を除いて、これは機能します。Bar
Baz
ここで何が間違っていますか?