0

私のアプリケーションでは、DbContextHTTP リクエストごとに新しいインスタンスを取得しています。通常のワークフローでは、エンティティを作成し、そのナビゲーション プロパティの一部の入力を開始します。

// 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

とオブジェクトの新しいインスタンスが作成されるという事実を除いて、これは機能します。BarBaz

ここで何が間違っていますか?

4

1 に答える 1

1

コンテキストに追加する前に、関連オブジェクトBarとオブジェクトを添付する必要があります。これにより、エンティティが状態になり、EF は、データベース内に新しいとオブジェクトを作成するのではなく、 と関連するエンティティの間のリレーションシップのみを作成します。BazfooUnchangedfooBarBaz

foreach (var bar in foo.Bars)
    context.Bars.Attach(bar);
context.Bazs.Attach(foo.Baz);
context.Foos.Add(foo);
context.SaveChanges();
于 2013-03-02T00:42:11.757 に答える