坚持断开POCO实体(Persisting disconnected POCO entities)

2019-09-28 08:45发布

我与断开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不能用相同的密钥跟踪多个目标。”

有谁知道,如果我做错了什么?

我只是想坚持对象及其相关对象。

感谢您帮助我。

路易斯·古斯塔沃


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

在那之后,我想坚持他们回数据库。

我做一个愚蠢的架构?

路易斯·古斯塔沃

Answer 1:

这里的问题似乎是,在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财产。



文章来源: Persisting disconnected POCO entities