我已经阅读了一些关于附件的问题和文字,但他们似乎跳过了一些关于它是如何工作的细节。例如,我不知道为什么会发生以下情况:
MyContext c = new MyContext();
MyEntity e = new MyEntity();
/* some local edits in e */
c.MyEntity.Add(e); // Works fine
但是如果我在另一个类(不创建新实例)的函数内编辑它,我会得到IEntityChangeTracker异常:
MyContext c = new MyContext();
MyEntity e = new MyEntity();
e = ViewModelClass.SomeFunctionWhichAltersAnExistingEntityInstance(e);
c.MyEntity.Add(e); //IEntityChangeTracker "multiple instances" exception
关于此主题的大多数答案都说,当对象附加到多个上下文时会发生这种情况。
如果发生这种情况,实体类的实例何时以及为何会自动附加到上下文(以及此上下文来自何处)?
关于使用的实体版本: RuntimeVersion:v4.0.30319 版本:5.0.0.0
答案 0 :(得分:0)
如您所见,问题在于您的导航属性来自另一个上下文(它们由另一个上下文跟踪)。 这些对象由另一个上下文跟踪。 当您调用Add方法时,EF不仅会将该对象添加为“已添加”,还会添加其所有“导航属性/关联”
你可以
1)将上下文作为参数传递给您的方法,并使用该上下文创建/读取您设置为导航属性的对象
2)当您从其他上下文创建相关属性时,使用.AsNoTracking() 要非常小心,在这种情况下,调用add方法将整个对象图标记为已添加。这意味着EF将为每个导航属性添加重复记录 您必须将每个导航财产的州财产设置为“未修改的”状态' (调用Add后,使用上下文的Entry方法) 有关详细信息,请查看此https://msdn.microsoft.com/en-us/magazine/dn166926.aspx