初始化并将数据库名称作为参数传递给具有整个类作用域的DbContext对象

本文关键字:作用域 对象 DbContext 数据库 参数传递 初始化 | 更新日期: 2023-09-27 18:17:07

我正在使用EF 6开发一个多租户MVC 5应用程序。对于每个用户,我都重写了实体构造函数,以获取数据库名称作为参数。我将数据库名称存储在针对所有用户维护的另一个代码优先数据库中。当用户登录时,他的数据库名被加载到会话中,然后传递给Entities构造函数。一切都很好,但问题是,

我想在我的控制器中声明具有类作用域的实体对象。现在:

  1. 会话只能在方法(ActionResult)中访问,所以不能在类作用域中使用。
  2. 不能使用静态变量
  3. 如果我在所有使用Entites的ActionResults中初始化实体对象,应用程序可以工作,但我不想一次又一次地初始化对象。
  4. Web中没有维护的连接字符串。在配置文件中,ConnectionString在代码中生成,反对作为参数传递的数据库名称,所以我不能使用ConfigurationManager类。

我想做的是:

public class ABCController : BaseController //BaseController has all Sessions
{
    private MyEntities db = new MyEntities("dbName"); //dbName is a session
    // all code and ActionResults here
}

我该怎么做?

初始化并将数据库名称作为参数传递给具有整个类作用域的DbContext对象

如果我在使用Entites的所有ActionResults中初始化entities对象,应用程序可以工作,但我不想一次又一次地初始化对象。

为什么不呢?这正是你应该做的。

即使它是类级别的成员,控制器实例也不会跨请求持久化。你会为用户发出的每个请求实例化它。这种方法所做的就是将实例化移到用户上下文可用之前。

每当用户向应用程序发出请求时,您都有该用户的上下文。(这里是session。)该上下文包含数据库连接的键。因此,每当用户发出请求时,使用该键创建数据库连接。