持久断开的POCO实体

时间:2011-11-29 18:18:10

标签: .net frameworks entity poco disconnected

我正在使用断开连接的POCO对象。

当我坚持使用单个对象时,它可以正常工作!

当我想要保留相关对象时,问题就开始了。

例如:

从数据层检索对象:

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

这个对象可以追溯到Business层,在那里,我添加了一些子记录,见下文(只是为了说明):

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无法使用相同的键跟踪多个对象”。

有人知道我做错了吗?

我只想保留对象及其相关对象。

感谢您的帮助。

Luiz Gustavo


我试图分离实体,但在这种情况下我松开了所有相关的对象,我需要这些相关的对象,以便我可以添加/删除。

之后,我想让他们坚持回到数据库。

我在做一个愚蠢的架构吗?

Luiz Gustavo

1 个答案:

答案 0 :(得分: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属性的。