asp.net-mvc - 在 MVC Web 应用程序中跨存储库共享 DbContext

标签 asp.net-mvc ef-code-first repository-pattern dbcontext service-layer

问题

在 MVC Web 应用程序中跨多个存储库共享 EF DbContext 的正确方法是什么?这样做是否谨慎/有必要,这样做或不这样做有什么陷阱?

背景

认为:

  • App.MvcSite (几十个 Controller ,多个区域等)
  • 应用服务 (服务层,很多服务)
  • 应用数据 (许多存储库等)
  • ...等为简单起见(EF Code First 最新)

  • 迄今为止的研究

    我似乎在 SO 和互联网上找到了至少两/三种思想流派。
  • 将您的 DbContext 共享/范围到请求 以便单个请求具有由所有存储库共享的单个 DbContext。
  • 在服务层共享/限定您的 DbContext -- 服务维护单个 DbContext 并根据需要将其传递给每个存储库。
  • 不要共享 DbContext,因为它们很便宜 让每个 Repo 都有自己的。

  • 在一个小型网站中,这不是问题,这就是为什么大多数 MS 和社区示例根本没有解决这个问题。

    到目前为止,根据我的经验,我还没有使用过有限的存储库。我一直让服务使用 DbContext 并直接更改它,所以我不需要担心这一点。有人告诉我,从单元测试的角度来看,有限存储库有很大的好处……我们会看看它是否让剩下的事情变得有值(value)。

    我的想法

    (1) Share/scope your DbContext to the Request



    这很有趣,因为它巧妙地避免了单例上下文的陷阱,一些开发人员认为这是答案,但发现 DbContext 不能那样工作。但它似乎有一个缺点,因为它假设所有存储库、服务等都将在整个请求中进行协调......这通常不是这种情况,对吧?如果一个 repo 在另一个 repo 完成其工作之前保存了更改会怎样。 (外(内(内)))

    (2) Share/scope your DbContext at the service layer



    这对我来说更有意义,因为每个服务都应该协调一个特定的工作单元(故意小写)。因此,如果在一个请求中使用了多个服务,那么每个服务都有自己的数据库上下文是正确的(如果不需要的话)。

    (3) Do not share a DbContext, since they are cheap



    这就是我一直这样做的方式......实际上我几乎总是每个请求只有一个 DbContext,因为只有一个服务被调用。有时可能是两个,因为协调工作的 Controller 调用了两个服务。但是考虑到我当前的应用程序,有许多有限的存储库,每个存储库都有自己的上下文意味着给定的请求可能有 3-10 个 DbContext 实例。我假设(也许是错误的)这是有问题的。

    重复问题:

    在 MVC Web 应用程序中跨多个存储库共享 EF DbContext 的正确方法是什么?这样做是否谨慎/有必要,这样做或不这样做有什么陷阱?

    最佳答案

  • DbContext很便宜,但分布式事务却不是。
  • 附加到一个上下文的对象不能在另一个上下文中使用(如果您有对象关系)

  • 共享上下文的最简单方法是开始使用控制反转容器:http://www.codeproject.com/Articles/386164/Get-injected-into-the-world-of-inverted-dependenci

    关于asp.net-mvc - 在 MVC Web 应用程序中跨存储库共享 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15113368/

    相关文章:

    c# - 异常类型 'System.ObjectDisposedException'

    entity-framework - 数据层中的IdentityUser

    asp.net-mvc - MVC UpdateModel 和子类与基类

    asp.net-mvc - 我可以在 .NET 4.0 下编译和运行 MVC1.0 应用程序吗?

    asp.net-mvc - 为什么软件包更新后出现 "Method not found: ' Void System.Web.Http.HttpResponseException..ctor”?

    c# - Entity Framework 代码优先延迟加载

    asp.net-mvc - ASP.Net MVC 中 UIHint 属性的用途是什么

    使用 Entity Framework Code First 的 C# 模型用户、好友请求和好友

    c# - 关于更新断开实体图的思考

    design-patterns - DDD 和 Entity Framework 中的聚合