如果我处理我的ObjectContext,我的实体是否已分离?

Fer*_*ndo 9 .net c# entity-framework

换句话说,如果我检索实体,然后处理我的ObjectContext,我是否必须明确分离所有实体?

Lad*_*nka 8

也许这取决于它的意义Detach.附加实体意味着上下文知道实体并跟踪其变化.如果您处置上下文,则它无法再跟踪更改,并且实体就像已分离.这里有类似意义.

如果您正在使用动态代理(POCO - 动态更改跟踪或延迟加载),则代理本身会在内部对内容进行向后引用,但它不会对上下文处理做出反应.它仍然保留引用(顺便说一下,这可能是一些讨厌的内存泄漏的来源).这会在两种情况下导致问题:

  • 当您尝试将此类实体附加到另一个上下文时,它将抛出一些异常,即只能通过单个上下文跟踪实体(尽管原始上下文已经死亡).
  • 当您尝试访问未加载的导航属性时,您将获得,ObjectDisposedException因为代理将触发已处置上下文的延迟加载.

避免这种情况的唯一方法是在处置上下文之前禁用动态代理或手动分离实体.这有另一个缺点 - 分离实体破坏了关系.


tay*_*onr 5

不,您不必在您的实体上调用分离.但是,如果您执行以下操作:

var people = Context.Person.Where(p => p.FirstName == "John");
Run Code Online (Sandbox Code Playgroud)

然后处理你的上下文,人们会抛出异常,因为IEnumerable已经延迟执行.这样做:

var people = Context.Person.Where(p => p.FirstName == "John").ToList();
Run Code Online (Sandbox Code Playgroud)

会让你仍然使用你的人员名单.

进一步,

var john = Context.Person.FirstOrDefault(p => p.Id == 342);
Run Code Online (Sandbox Code Playgroud)

将在处理上下文后工作,因为您已获取特定实体而非枚举.


Mac*_*iej 2

一旦上下文被释放,你的实体就会被分离。请参阅以下帖子:

实体框架多对象上下文