簡體   English   中英

上下文正在Code First模式中使用,其代碼是從EDMX文件生成的

[英]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=&quot;data source=.;initial catalog=Awais;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
      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毫無意義。

要擁有一個使用每個租戶策略數據庫的單實例應用程序,您應該:

  • 對所有租戶使用單個dbcontext類
  • 向接受connnectionstring的dbcontext構造函數添加重載
  • 為每個租戶創建一個數據庫
  • 根據您的租戶檢測策略在運行時創建連接字符串
  • 創建dbcontext實例,根據您的租戶檢測策略傳遞您在運行時創建的connectionstring

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM