【发布时间】:2011-10-22 16:58:59
【问题描述】:
MVC 3 + EF 4.1
我在两种处理 DbContext 的方法之间进行选择:
- 在
Application_BeginRequest中实例化,放入HttpContext.Current.Items并在Application_EndRequest中处理。 - 创建一次性 UnitOfWork(
DbContext的包装类型)和 使用using(var unitOfWork = new UnitOfWork()) { ... }启动每个控制器操作
请分享您的经验:您更喜欢哪一种?每种方法的优缺点是什么?
【问题讨论】:
-
使用块方法有一些缺点。它会导致大量的数据库往返和实体框架中的事务滥用。参考ayende.com/blog/4775/…
-
为什么会导致更多的往返?在大多数情况下,一个 http 请求应该运行一个操作,所以如果你将整个操作的代码包装到这个 using 块中,与第一种方法相比,不会有更多的数据库请求。 “按操作”方法的另一件事是,您应该始终了解可能调用数据库的范围并适当地放置块。例如,如果您的模型包含一些要在视图渲染时延迟加载的集合,则返回 View(Model) 的语句应该在块内。
-
如果您在控制器层中使用 DbContext,使用 UnitOfWork 包装会在 UI 层和您的数据库方法中创建强依赖性。然后你需要一个服务层和存储库层。之后,如果您的存储库有单独的 UnitOfWork 并使用块,那将是一个问题。因为每个存储库都会创建事务和不必要的数据库往返。有关更多详细信息,请参见上面的链接。如果您确定每个请求有一个服务调用,那么您可以在服务方法中使用 unitofwork。但是,这不是保证。
-
每个 http 请求可能有 2 个或更多的服务调用,但它们最有可能在同一个操作方法中。因此,一旦将它们全部包装在单个 UnitOfWork 下,它们就会共享一个 DbContext。是的,即使具有相同的 DbContext,它们也可能在单独的事务下一个接一个地运行,但第一种方法的工作方式相同
-
如果其中一项交易失败会怎样?你能恢复另一个还是那些是独立的?那就是问题所在。另外,如果你这样做,你的 UI 层将依赖于实体框架,不是吗?
标签: asp.net-mvc entity-framework entity-framework-4.1 poco dbcontext