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

时间:2011-06-23 15:52:28

标签: c# .net entity-framework

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:5)

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

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 :(得分:2)

上下文处理后,您的实体将被分离。请参阅以下帖子:

Entity Framework Multiple Object Contexts