ASP.NET MVC与Entity Framework

6

我认为在Application_BeginRequest中设置实体对象上下文并将其存储在Request.items中,然后在整个请求期间使用它,并在Application_EndRequest中释放它会很明智。这样,上下文始终可用,我可以在视图中浏览实体框架对象图,懒加载我尚未积极获取的内容。

我认为这将使开发更像Ruby on Rails

但是我无法在ASP.NET MVC上触发Application_BeginRequest和..EndRequest。它们没有被触发吗?我需要做什么特殊的技巧吗?

2个回答

6

EF中的对象上下文,就像L2S中的数据上下文一样,被设计为“工作单元”,它们不是线程安全的,也不是为了长时间存在而设计的。

在MVC中,最好的策略是在控制器的构造函数中创建一个对象上下文(隐式或显式都可以),然后在Dispose方法中释放它。当然,EF不会进行延迟加载,所以你需要自己找到懒加载的方法。 :)


3
不,这是一种不好的方法。它会使控制器难以测试,并且意味着工作单元在控制器之外不可用。下文提到的“每个请求一个Session”模式更好。EF v1支持延迟加载——只需显式声明即可。 - Andrew Peters
我认为你误解了“延迟加载”的含义。EF允许您自动地急切地加载关系,但不允许延迟加载。至于可测试性,我同意直接使用对象上下文会影响可测试性,但与ctor/dispose的使用无关。 - Brad Wilson
兄弟,这只需要“明确”就可以了。http://blogs.msdn.com/jkowalski/archive/2008/05/12/transparent-lazy-loading-for-entity-framework-part-1.aspx - Andrew Peters

4

ASP.NET MVC 1.0版本允许我在beginrequest和endrequest上挂载事件处理程序,可以在beginrequest中新建一个SessionScope并将其存储在HttpContext.Items中(我切换到了Castle ActiveRecord),然后在endrequest中从HttpContext.Items中取出sessionscope并进行处理。这样就可以实现整个请求生命周期中的延迟加载(甚至可以在视图中遍历对象图)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接