2013-03-01 48 views
0

在我的應用程序中,我們爲每個HTTP請求獲取我們的DbContext的新實例。在正常的工作流程,我們創建一個實體,並開始填充它部分的導航性能:我如何讓Entity Framework與我分離的對象圖一起工作?

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

的添加通常只是增加了實體到DbSet,然後調用保存更改:

Set.Add(entity); 
Context.SaveChanges(); 

顯然,這由於失敗的事實,foo對象包含多個代理對象,每個代理對象都連接到不同的DbContexts。我們決定在是分離的對象,我們是接受的解決方案:對於事實,這現在創建BarBaz對象的新實例

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

這工作,除

我在這裏做錯了什麼?

回答

1

在將foo添加到上下文之前,您必須附加相關的BarBaz對象。這使實體進入狀態Unchanged和EF只會製造和相關的實體,而不是在數據庫中創建新BarBaz對象foo之間的關係:

foreach (var bar in foo.Bars) 
    context.Bars.Attach(bar); 
context.Bazs.Attach(foo.Baz); 
context.Foos.Add(foo); 
context.SaveChanges(); 
相關問題