【发布时间】:2015-10-01 11:21:52
【问题描述】:
我正在使用 EF 6 数据库优先方法开发 MVC 5 应用程序。现在我希望我的 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" />
而我做EDMX时EF生成的连接字符串是:
<add name="ABCEntities" connectionString="metadata=res://*/Models.awais.csdl|res://*/Models.awais.ssdl|res://*/Models.awais.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=Awais;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
然后我将我的实体构造函数重载为:
public ABCEntities(string nameorConnString) : base(nameorConnString) {}
而默认的构造函数是:
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
现在所有这些都成功运行,并且在 SQL Server 中创建了数据库。但后来当我尝试在该数据库上查询时出现错误:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
它会抛出一个错误
上下文在 Code First 模式下使用 从数据库优先或模型优先的 EDMX 文件生成 发展。这将无法正常工作。要解决此问题,请不要 删除引发此异常的代码行。如果您想使用 数据库优先或模型优先,然后确保实体 框架连接字符串包含在 app.config 或 启动项目的 web.config。如果您正在创建自己的 DbConnection,然后确保它是 EntityConnection 而不是 一些其他类型的 DbConnection,并将其传递给其中一个 采用 DbConnection 的基本 DbContext 构造函数。了解更多 关于 Code First、Database First 和 Model First 见实体 框架文档在这里: http://go.microsoft.com/fwlink/?LinkId=394715
我能做什么?我必须对所有用户数据库和 ABCEntities 的相同对象(即“db”)使用单个 DbContext 来访问控制器方法中的数据库。 我已经查看了this question DbFactory 方法,但出现了同样的错误。
我想做一个单实例多租户应用程序
问候。
【问题讨论】:
标签: c# asp.net-mvc entity-framework ef-code-first ef-database-first