1

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

当我坚持一个对象时,它工作正常!

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

例如:

从数据层检索对象:

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

这个对象回到业务层,在那里,我添加了一些子记录,见下文(只是为了说明):

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

有谁知道我做错了什么?

我只想持久化对象及其相关对象。

谢谢你帮助我。

路易斯·古斯塔沃


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

之后,我想将它们持久化回数据库。

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

路易斯·古斯塔沃

4

1 回答 1

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 属性的。

于 2011-11-29T18:51:16.087 回答