2011-11-29 78 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();' –