Awa*_*ood 2 c# asp.net-mvc entity-framework ef-code-first ef-database-first
我正在开发一个使用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();
Run Code Online (Sandbox Code Playgroud)
配置文件中生成的连接字符串是:
<add name="Awais123" connectionString="Data Source=.;Initial Catalog=Awais123;integrated security=True;MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
我制作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" />
Run Code Online (Sandbox Code Playgroud)
然后我重载了我的Entities构造函数:
public ABCEntities(string nameorConnString) : base(nameorConnString) {}
Run Code Online (Sandbox Code Playgroud)
默认的构造函数是:
public ABCEntities() : base("name=ABCEntities") {}
Run Code Online (Sandbox Code Playgroud)
现在我在另一个.cs文件中声明另一个DbContext类来生成数据库:
public partial class NewDbGen : DbContext
{
public NewDbGen(string nameorConnString): base(nameorConnString)
{ Database.Create(); }
}
Run Code Online (Sandbox Code Playgroud)
我将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
Run Code Online (Sandbox Code Playgroud)
现在所有这些都成功运行,并在SQL Server中创建数据库.但后来当我尝试查询该数据库时出现错误:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
Run Code Online (Sandbox Code Playgroud)
它会引发错误
在Code First模式中使用上下文,其中包含从EDMX文件生成的用于Database First或Model First开发的代码.这将无法正常工作.要解决此问题,请不要删除引发此异常的代码行.如果您希望使用Database First或Model First,请确保Entity Framework连接字符串包含在启动项目的app.config或web.config中.如果要创建自己的DbConnection,请确保它是EntityConnection而不是其他类型的DbConnection,并将其传递给采用DbConnection的基本DbContext构造函数之一.要了解有关Code First,Database First和Model First的更多信息,请参阅此处的Entity Framework文档:http: //go.microsoft.com/fwlink/?LinkId = 394715
我能做什么?我必须对所有用户数据库和ABCEntities的相同对象使用单个DbContext,即"db"来访问控制器方法中的数据库.我已经研究过这个问题 DbFactory方法,但发生了同样的错误.
我想制作一个单实例多租户应用程序
问候.
当您使用Database-First方法并使用edmx时,使用OnModelCreating毫无意义.
要拥有一个使用每个租户策略数据库的单实例应用程序,您应该:
| 归档时间: |
|
| 查看次数: |
6057 次 |
| 最近记录: |