C# 该上下文正在代码优先模式下与从EDMX文件生成的代码一起使用
我正在使用EF6数据库优先方法开发一个MVC5应用程序。现在,我希望我的DbContext能够基于不同的用户访问多个数据库。为此,我在Web.Config文件中生成了一个连接字符串,如下所示:C# 该上下文正在代码优先模式下与从EDMX文件生成的代码一起使用,c#,asp.net-mvc,entity-framework,ef-code-first,ef-database-first,C#,Asp.net Mvc,Entity Framework,Ef Code First,Ef Database First,我正在使用EF6数据库优先方法开发一个MVC5应用程序。现在,我希望我的DbContext能够基于不同的用户访问多个数据库。为此,我在Web.Config文件中生成了一个连接字符串,如下所示: string str = u.Users.Where(x => x.UserName == HttpContext.User.Identity.Name).First().ConnStr; var configuration = WebConfigurationManager.OpenWebConf
string str = u.Users.Where(x => x.UserName == HttpContext.User.Identity.Name).First().ConnStr;
var configuration = WebConfigurationManager.OpenWebConfiguration("~");
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");
ConnectionStringSettings c = new ConnectionStringSettings();
c.ConnectionString = str;
c.Name = u.Users.Where(x => x.ConnStr == str).First().DbName;
c.ProviderName = "System.Data.SqlClient";
section.ConnectionStrings.Add(c);
configuration.Save();
配置文件中生成的连接字符串为:
<add name="Awais123" connectionString="Data Source=.;Initial Catalog=Awais123;integrated security=True;MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
默认构造函数是:
public ABCEntities() : base("name=ABCEntities") {}
现在,我在另一个.cs文件中声明另一个DbContext类以生成数据库,如下所示:
public partial class NewDbGen : DbContext
{
public NewDbGen(string nameorConnString): base(nameorConnString)
{ Database.Create(); }
}
我将DbContext对象称为:
private static string str = u.Users.Where(x => x.UserName == HttpContext.User.Identity.Name).First().ConnStr;
private NewDbGen de = new NewDbGen(str); // for creating a new database
private ABCEntities db = new AbcEntities(str); // my original Entites.. and all my controllers use these entites for all queries
现在,所有这些都成功运行,并且在SQLServer中创建了数据库。但后来,当我试图查询该数据库时,出现了一个错误:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
它抛出了一个错误
上下文正在代码优先模式下使用,代码为
从数据库优先或模型优先的EDMX文件生成
发展。这将无法正常工作。要解决此问题,请不要
删除引发此异常的代码行。如果你想使用
首先是数据库或模型,然后确保实体
app.config或中包含框架连接字符串
启动项目的web.config。如果您正在创建自己的
DbConnection,然后确保它是EntityConnection,而不是
其他类型的数据库连接,并将其传递给
采用DbConnection的基本DbContext构造函数。了解更多
关于代码优先、数据库优先和模型优先查看实体
此处的框架文档:
我能做什么?我必须对所有用户数据库使用单个DbContext,并使用相同的ABCEntities对象,即“db”来访问控制器方法中的数据库。
我已经研究过DbFactory方法,但同样的错误也发生了
我想制作一个单实例多租户应用程序
问候 当您首先使用数据库方法,然后使用edmx时,再使用是没有意义的 要使单实例应用程序使用每租户数据库策略,您应该:
- 对所有租户使用单个dbcontext类
- 向接受ConnectionString的dbcontext构造函数添加重载
- 为每个租户创建一个数据库
- 根据租户检测策略在运行时创建connectionstring
- 创建一个dbcontext实例,传递您在运行时根据租户检测策略创建的connectionstring
private static string str = u.Users.Where(x => x.UserName == HttpContext.User.Identity.Name).First().ConnStr;
private NewDbGen de = new NewDbGen(str); // for creating a new database
private ABCEntities db = new AbcEntities(str); // my original Entites.. and all my controllers use these entites for all queries
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}