我正在使用断开连接的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
答案 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属性的。