2012-07-31 16 views
0

我有一些類型的A,B,C和X之間的下列關係:呼叫連接並添加提供相同的對象作爲參數

A->B->X 
|->C->X 
|->X 

現在假設我想一個新的A添加到數據庫中,並它與B,C的現有實例和X關聯

我在做什麼是這樣的:

using (Context context = new Context()) 
{ 
    context.As.Attach(A); 
    context.As.Add(A); 
    context.SaveChanges(); 
} 

它似乎工作,但我不知道這件事,因爲連接通常用於連接存在於g實例。

這種替代不起作用:

using (Context context = new Context()) 
{ 
    context.Bs.Attach(A.B); 
    context.Cs.Attach(A.C); 
    context.As.Add(A); 
    context.SaveChanges(); 
} 

因爲在這種情況下,X被連接兩次(ABX和ACX)和實體框架拋出一個異常:

System.InvalidOperationException: 
An object with the same key already exists in the ObjectStateManager. 
The ObjectStateManager cannot track multiple objects with the same key. 

是否有意義使用我的解決方案還是有更好的方法來做到這一點?

回答

1

是的,你的解決方案是有道理的 - 你已經附上了整個圖表,並將A更改爲Added狀態。它也可以被改寫爲:

using (Context context = new Context()) 
{ 
    context.As.Attach(A); 
    context.Entry(A).State = EntityState.Added; 
    context.SaveChanges(); 
} 

在一些複雜的場景也可以是有用的也做,在相反的順序 - 添加所有和更改所有現有項目的狀態。

相關問題