【问题标题】:Using the same DbContext object across different controllers跨不同控制器使用相同的 DbContext 对象
【发布时间】:2015-07-30 18:34:21
【问题描述】:

我正在编写一个 MVC 5 互联网应用程序,并且对跨不同控制器使用相同的实例化 DbContext 对象有疑问。

我想这样做是因为我在不同的控制器中检索一些相同的数据,并且DbContext 类的内置缓存功能将最大限度地减少许多数据库事务。

这里有一些代码来解释:

public class TestController1 : Controller
{
    private CanFindLocationDatabaseContext db = new CanFindLocationDatabaseContext();
}

public class TestController2 : Controller
{
    private CanFindLocationDatabaseContext db = new CanFindLocationDatabaseContext();
}

编写此代码的最佳方法是什么,这有什么缺点吗?每个用户应该有自己的 DbContext 对象,还是只为所有用户提供一个?在编码之前我应该​​注意什么?发生 CRUD 操作时是否会发生潜在冲突?

提前致谢。

【问题讨论】:

    标签: c# controller asp.net-mvc-5 entity-framework-6 dbcontext


    【解决方案1】:

    这可能会对你有所帮助,如果这是你所问的或者我能理解的话。 您可以创建一个 BaseController ,您可以在其中创建 DbContext 实例。之后,您可以在每个 Controller 中继承此 Basecontroller。

    public class BaseController : Controller
    {
      public BaseController()
      {
         CanFindLocationDatabaseContext db = new CanFindLocationDatabaseContext();
      }
    }
    

    现在像这样在所有控制器中继承它:

    public class YourController:BaseController
    {
        public ActionResult Hello()
        {
          //us your db instance here now
        }
    
    }
    

    【讨论】:

    • 我认为你可以通过这样做来实现这一点。在所有控制器中继承一个基本控制器。或者对不起,我无法正确理解这个问题。
    • 这仍然会为每个控制器创建一个实例,而不是共享一个公共实例。
    【解决方案2】:

    您也可以使用一个类作为包装器,并对 dbcontext 放置一个静态引用。

    【讨论】:

      【解决方案3】:

      您不应该为所有控制器使用相同的 dbContext。这样做不是一个好习惯,因为这样框架必须跟踪更多的实体,如果 EF 方面出现问题,也很难调试。 每个控制器类使用一个 dbContext。

      【讨论】:

      • 不,这不是真的。如果您将依赖注入/控制反转与 PerRequestLifetimeManager 一起使用,您将为所有控制器设置一个上下文,但它会为每个请求创建和销毁。实际上,每个控制器都有一个实例,但您只需要在配置统一容器时进行一次设置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多