MVC 3 + EF 4.1在MVC中实例化和处理DbContext的最佳方式是什么?
我对付的DbContext两种方法之间进行选择:
- 实例化
Application_BeginRequest
,放入HttpContext.Current.Items
和Application_EndRequest
处理。 - (为
DbContext
kindof包装)创建一次性的UnitOfWork并 开始using(var unitOfWork = new UnitOfWork()) { ... }
每个控制器动作分享您的体验,请:一个你会喜欢哪一种?每种方法有哪些优缺点?
使用块方法有一些缺点。它会导致很多往返数据库和滥用Entity框架中的事务。请参阅http://ayende.com/blog/4775/new-profiler-feature-avoid-writes-from-multiple-sessions-in-the-same-request – marvelTracker
为什么会导致更多往返?一个http请求应该在大多数情况下运行一个动作,所以如果你将整个动作的代码包装到这个使用块中,与第一种方法相比,不会有更多的数据库请求。 “每操作”方法的另一件事是,您应该始终注意数据库可能被调用的作用域并适当地放置该块。例如,如果您的模型包含一些要在一段时间视图渲染中加载的集合,则返回View(Model)的语句应该位于该块内部。 – YMC
如果在控制器层中使用DbContext,则UnitOfWork会在UI层和数据库方法中创建强依赖关系。然后你需要一个服务层和存储库层。之后,如果您的存储库使用单独的UnitOfWork,并使用将成为问题的块。因为每个存储库都会创建事务和不必要的数据库往返。请参阅上面的链接了解更多详情如果你确定每个请求有一个服务调用,那么你可以在服务方法内部使用单元工作。但是,这不是保证。 – marvelTracker