C# 该上下文正在代码优先模式下与从EDMX文件生成的代码一起使用

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

我正在使用EF6数据库优先方法开发一个MVC5应用程序。现在,我希望我的DbContext能够基于不同的用户访问多个数据库。为此,我在Web.Config文件中生成了一个连接字符串,如下所示:

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

Lae但它仍然可能对某人有所帮助。
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();
}