如果我处理掉我的ObjectContext,我的实体会被分离吗?

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

8
也许这取决于"分离(Detach)"的含义。"已附加(Attached)"实体意味着上下文知道该实体并跟踪其更改。如果您处置上下文,它将无法再跟踪更改,实体就像是被分离了。这里的"像"有真正的含义。
如果您正在使用动态代理(POCO-动态更改跟踪或延迟加载),则代理本身会在内部保留对上下文的反向引用,但不会对上下文处置做出反应。它仍然保持引用(顺便说一句,这可能是一些令人讨厌的内存泄漏的源头)。这会在两种情况下造成问题:
- 当您尝试将这样的实体附加到另一个上下文时,它会抛出一些异常,指出实体只能由单个上下文跟踪(尽管原始上下文已经失效)。 - 当您尝试访问未急切加载的导航属性时,您将收到"ObjectDisposedException",因为代理将在已处置的上下文上触发延迟加载。
避免这种情况的唯一方法是禁用动态代理或在处置上下文之前手动分离实体。这又有一个缺点-分离实体会破坏关系。

5
不需要对实体调用detach。但是,如果您执行以下操作:
var people = Context.Person.Where(p => p.FirstName == "John");

当您处理完上下文并且尝试访问IEnumerable的延迟执行时,会抛出异常。

解决方法:

var people = Context.Person.Where(p => p.FirstName == "John").ToList();

您仍然可以使用您的人员列表。

此外,

var john = Context.Person.FirstOrDefault(p => p.Id == 342);

因为你获取的是特定实体而不是枚举,所以在上下文被处理后仍将起作用。


2

1
你能否建议在ObjectContext被Dispose时需要分离实体吗?这个建议不正确吗? - glosrob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接