2011-11-29 198 views
1

我正在使用斷開連接的POCO對象。堅持斷開POCO實體

當我堅持一個對象,它工作正常!

當我想要保留相關對象時,問題就開始了。

例如:

從數據層檢索對象:

using (MyContext ctx = new MyContext()) 
{ 
    return ctx.Users.First(); 
} 

這個對象可以追溯到業務層和那裏,我添加一些子記錄,見下文(只是爲了ilustrate):

objectUser.Permissions.Add(new Permission()); 
objectUser.Permissions.Add(new Permission()); 

權限是用戶權限的導航。

然後,我要堅持這個objectUser回數據庫,然後我做的:

using (MyContext ctx = new MyContext()) 
{ 
    ctx.Users.Attach(objectUser); 
    ctx.ObjectStateManager.ChangeObjectState(objectUser, System.Data.EntityState.Modified); 
    ctx.SaveChanges();      
} 

但在使用中第一行,我得到的錯誤:「具有相同的鍵中已經存在的對象ObjectStateManager。ObjectStateManager無法使用相同的鍵追蹤多個對象「。

有誰知道我是否做錯了什麼?

我只想堅持對象及其相關對象。

感謝您的幫助。

路易斯·古斯塔沃


我試圖脫離實體,但在這種情況下,我失去所有相關的對象,我需要這些相關的對象,這樣我可以添加/刪除。

之後,我想堅持他們回數據庫。

我在做一個愚蠢的建築?這裏

路易斯·古斯塔沃

回答

0

這個問題似乎是在objectUser對象仍連接到用於從數據庫中檢索它的上下文。如果您在需要定義兩種不同上下文的情況下需要此工作流程,則必須從初始上下文中分離objectUser。一種方法是關閉objectUser上下文對象上的對象跟蹤。或者,您可以手動從上下文中分離對象。

using (MyContext ctx = new MyContext()) 
{ 
    //EF 4.1 - ctx.Configuration.AutoDetectChangesEnabled = false; 
    ctx.Users.MergeOption = MergeOption.NoTracking; 

    return ctx.Users.First(); 
} 

博客:http://blogs.msdn.com/b/dsimmons/archive/2010/01/12/ef-merge-options-and-compiled-queries.aspx

第1部分是所有關於MergeOption財產。

+0

嗨加里,謝謝你的回覆。 問題是,當分離實體時,我放鬆了所有相關的對象。有沒有辦法讓我可以得到實體及其所有相關對象以便與它們一起工作? – user1071897

+0

您應該可以使用Include,例如'return ctx.Users.Include(「Permissions」)。First();' –