C# 实体实例何时自动附加到上下文?

C# 实体实例何时自动附加到上下文?,c#,entity-framework,C#,Entity Framework,我读了一些关于附件的问题和文字,但它们似乎忽略了一些关于附件工作原理的细节。例如,我不知道为什么会发生以下情况: MyContext c = new MyContext(); MyEntity e = new MyEntity(); /* some local edits in e */ c.MyEntity.Add(e); // Works fine 但如果我在另一个类上的函数中编辑它,而该类不创建新实例,则会得到IEntityChangeTracker异常: MyContext c

我读了一些关于附件的问题和文字,但它们似乎忽略了一些关于附件工作原理的细节。例如,我不知道为什么会发生以下情况:

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
关于这个问题的大多数答案都说,当一个对象连接到多个上下文时,就会发生这种情况

如果发生这种情况,实体类的实例何时以及为什么会自动附加到ContextName?该上下文来自何处

关于使用的实体版本: 运行时版本:v4.0.30319
版本:5.0.0.0

正如您所看到的,问题在于您的导航属性来自另一个上下文它们被另一个上下文跟踪。 这些对象由另一个上下文跟踪。 调用Add方法时,EF不仅将该对象添加为已添加的对象,还将添加其所有导航属性/关联

你可以 1将上下文作为参数传递给方法,并使用该上下文创建/读取设置为导航属性的对象

2从其他上下文创建相关属性时使用.AsNoTracking。 非常小心,在本例中,调用add方法时将整个对象图标记为Added。这意味着EF将为每个导航属性添加重复记录。 在调用Add之后,必须使用上下文的Entry方法将每个导航属性的State属性设置为“未修改”。
有关更多信息,请检查此

是否在方法中设置主键属性?@georgevos No.它是一个标识1,1是否在方法中设置导航属性?方法中的代码是否与e*/中的/*某些本地编辑相同?如果你愿意,请告诉我们方法can@GeorgeVovos就这样。存在e.myentity2=ViewModel.myentity2,其中ViewModel.myentity2是先前从本地编辑中不存在的数据库中查询到的。当我将该行添加到原始函数时,它也抛出了异常。这句话可能没有必要,但你能给我解释一下问题吗?