【问题标题】:Manage ADO.NET Entity Framework ObjectContext in ASP.NET MVC在 ASP.NET MVC 中管理 ADO.NET 实体框架 ObjectContext
【发布时间】:2010-09-27 02:27:22
【问题描述】:

我在 MVC 应用程序中使用 ADO.NET EF。我正在考虑将 ObjectContext 放在 HttpContext.Current 中,以便同一请求中的所有逻辑都可以访问它,而不必每次都打开/销毁。但是,我很确定这是否是管理 ObjectContext 实例的好方法。关于此需求,我有 2 个问题:

  1. 由于 HttpContext.Current 属性由线程本地字段支持,并且 ASP.NET 使用池中的线程来处理请求,因此请求放入 HttpContext.Current 的 ObjectContext 实例是否可能对在池中的同一线程上运行的后续请求?

  2. 您认为应该如何在 ASP.NET MVC 中管理 ObjectContext 以避免大量打开/处理并防止竞争条件?

【问题讨论】:

    标签: asp.net-mvc multithreading entity-framework


    【解决方案1】:

    我会使用 IoC 容器,例如 StructureMap、Autofac、Windosor 等。

    【讨论】:

      【解决方案2】:

      我同意 Todd - 使用具有每个线程(或自定义每个请求)生命周期的 DI/IoC 组合(Unity、Windsor)。

      广告 2,我记得在 Linq to SQL 中,DataContext 对象被认为是轻量级对象,因此经常创建它应该不是问题。希望 EF 也是如此。

      【讨论】:

        【解决方案3】:

        使用Repository pattern。重写 Controller.Dispose 以处置 Repository,而后者又处置 DataContext。

        【讨论】:

          【解决方案4】:

          感谢 IoC 的建议。我使用 Unity 并实现了一个按请求生命周期管理器来通过 HttpContext.Current 存储/检索对象。似乎工作正常。

          【讨论】:

          • 您能否发布代码以显示您如何将对象添加到 HttpContext.Current?您是否将其添加到 Items 集合中,还是...?
          • 这是自定义 Unity 生命周期管理器中的代码:HttpContext.Current.Items[key] = newValue
          【解决方案5】:

          每个请求使用单个 ObjectContext 是个好主意。

          如果您自己处理它,您需要将上下文放在 HttpContext.Items 集合中。在 EndRequest 上,您需要确保已释放上下文。

          如前所述,一些 IoC 框架支持此 OTB - 通常称为 PerRequest 范围/生命周期。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-11
            • 2011-02-13
            • 2013-03-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多