在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。
您必须在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="data source=.;Initial Catalog={0};uid=sa; pwd=password;MultipleActiveResultSets=True;App=EntityFramework"" 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();