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

本文关键字:上下文 实例 何时自 实体 | 更新日期: 2023-09-27 17:57:27

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

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

关于这个问题的大多数答案都说,当一个对象连接到多个上下文时,就会发生这种情况。

如果发生了这种情况,实体类的实例何时以及为什么会自动附加到上下文(这个上下文来自哪里)?

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

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

正如您所看到的,问题是您的Navigational属性来自另一个上下文(它们由另一个语境跟踪)。这些对象由另一个上下文跟踪。当您调用Add方法时,EF不仅将该对象添加为Added,而且还将其所有导航属性/关联

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

2) 从其他上下文创建相关属性时,请使用.AsNoTracking()
在这种情况下,调用add方法时要非常小心,并将整个对象图标记为Added。这意味着EF将为每个导航属性添加重复记录
在调用Add之后,您必须将每个Navigational Property的State属性设置为"Unmodified"(使用上下文的Entry方法)
有关更多信息,请查看https://msdn.microsoft.com/en-us/magazine/dn166926.aspx