【发布时间】:2011-06-24 03:08:35
【问题描述】:
换句话说,如果我检索实体,然后处置我的 ObjectContext,我是否必须显式分离我的所有实体?
【问题讨论】:
标签: c# .net entity-framework
换句话说,如果我检索实体,然后处置我的 ObjectContext,我是否必须显式分离我的所有实体?
【问题讨论】:
标签: c# .net entity-framework
也许这取决于Detach 的含义。附加实体意味着上下文知道实体并跟踪其更改。如果您处理上下文,它将无法再跟踪更改,并且实体就像分离。喜欢在这里有真正的意义。
如果您使用动态代理(POCO - 动态更改跟踪或延迟加载),代理本身会在内部保持对上下文的向后引用,但不会对上下文处理做出反应。它仍然保留引用(顺便说一句。这可能是一些令人讨厌的内存泄漏的来源)。这在两种情况下会导致问题:
ObjectDisposedException,因为代理将触发已释放上下文的延迟加载。避免这种情况的唯一方法是禁用动态代理或在释放上下文之前手动分离实体。这还有另一个缺点 - 分离实体会破坏关系。
【讨论】:
不,您不必对实体调用 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);
将在上下文处理后工作,因为您获取的是特定实体而不是枚举。
【讨论】:
一旦上下文被释放,你的实体就会被分离。请参阅以下帖子:
【讨论】: