![](/img/trans.png)
[英]Entity Framework: The context is being used in Code First mode with code that was generated from an EDMX file
[英]The context is being used in Code First mode with code that was generated from an EDMX file
我正在開發一個使用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" />
然后我重載了我的Entities構造函數:
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文件生成的用於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毫無意義。
要擁有一個使用每個租戶策略數據庫的單實例應用程序,您應該:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.