在ASP.NET MVC中管理ADO.NET实体框架ObjectContext

时间:2008-12-16 06:43:08

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

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

  1. 由于HttpContext.Current属性由线程局部字段支持,并且ASP.NET使用池中的线程来处理请求,因此可能会将请求放入HttpContext.Current的ObjectContext实例显示为从池中运行同一线程的后续请求?

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

5 个答案:

答案 0 :(得分:5)

使用Repository pattern。覆盖Controller.Dispose以处置Repository,而Repository又处理DataContext。

答案 1 :(得分:2)

我会使用像StructureMap,Autofac,Windosor等的IoC容器

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

我同意Todd - 使用DI / IoC cotnainer(Unity,Windsor)和每线程(或每个请求的自定义)生命周期。

Ad 2,我记得,在Linq to SQL中,DataContext对象被认为是一个轻量级对象,所以经常创建它不应该是一个问题。希望它与EF类似。

答案 4 :(得分:0)

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