在MVC中使用EF创建多个数据库,并将数据库名称作为web.config中的变量传递给initialcatalog

本文关键字:数据库 config web 变量 initialcatalog EF MVC 创建 | 更新日期: 2023-09-27 18:12:30

我正在开发一个MVC 5应用程序,它首先使用2个代码数据库和1个数据库。现在我想部署它,并使其可供多个客户机使用。为此,我想为每个新客户端生成我的Database First Database。我的数据库第一个数据库有103个表,其中还内置了pkk, fk和触发器。

我的DbContext如下:

public partial class MyEntities : DbContext
{
    public MyEntities() : base("name=MyEntities")
    {
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
    ** Here are my DbSet's **
}

现在我主要关心的是,我还想使用MyEntities来访问每个客户端的数据库。因为我的所有控制器验证都是用实体名访问数据库的,如下所示:

public MyEntities db = new MyEntities();

现在我如何能够为每个客户端创建一个新的数据库,并且上下文名称应该保持不变,以便我不必在控制器中更改代码?此外,我还必须将 initialcatalog 名称作为变量传递给web。

在MVC中使用EF创建多个数据库,并将数据库名称作为web.config中的变量传递给initialcatalog

您必须在DbContext中添加一个构造函数,如下所示:

public partial class MyEntities : DbContext
{
    public MyEntities(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
    }
}

你应该在一个单独的*.cs文件中添加这个构造函数,因为前面的构造函数是自动生成的。还要确保命名空间应该与自动生成的代码相同。

现在,您可以使用所需数据库的连接字符串web实例化DbContext类。config配置如下:
public MyEntities db = new MyEntities(ConfigurationManager.ConnectionStrings["database1"]);

如何传递初始目录作为变量名?

你可以这样做;

<add name="MyDBContext" connectionString="metadata=res://*/model.csdl|res://*/model.ssdl|res://*/model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;Initial Catalog={0};uid=sa; pwd=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>

首先,你将重载你的实体构造函数作为回答。现在在用户登录,你必须把他们的数据库名称在会话变量。我们称它为"dbName"。所以现在你可以这样访问它:

var connection = System.Configuration.ConfigurationManager.ConnectionStrings["MyDBContext"].ConnectionString;
var connectionString = string.Format(connection, System.Web.HttpContext.Current.Session["dbName"].ToString());
var db = new YourEntities(connectionString);
db.Database.CreateIfNotExists();