【问题标题】:If I dispose of my ObjectContext, are my entities detached?如果我处置了我的 ObjectContext,我的实体是否已分离?
【发布时间】:2011-06-24 03:08:35
【问题描述】:

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

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    也许这取决于Detach 的含义。附加实体意味着上下文知道实体并跟踪其更改。如果您处理上下文,它将无法再跟踪更改,并且实体就像分离。喜欢在这里有真正的意义。

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

    • 当您尝试将此类实体附加到另一个上下文时,它会抛出一些异常,即实体只能由单个上下文跟踪(尽管原始上下文已经失效)。
    • 当您尝试访问未急切加载的导航属性时,您将收到 ObjectDisposedException,因为代理将触发已释放上下文的延迟加载。

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

    【讨论】:

      【解决方案2】:

      不,您不必对实体调用 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);
      

      将在上下文处理后工作,因为您获取的是特定实体而不是枚举。

      【讨论】:

        【解决方案3】:

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

        Entity Framework Multiple Object Contexts

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 2011-03-31
        • 2011-07-30
        • 1970-01-01
        • 2012-11-08
        相关资源
        最近更新 更多