2014-11-05 61 views
1

的情況是:Enity框架6.0.0.0:無法產生明確的遷移與...基於代碼遷移

  1. 每個租戶分貝。
  2. 非自動基於代碼的遷移。 dbs的初始創建也是通過Code First來完成的。當前場景中沒有預先存在的dbs。
  3. 確切的數據庫在生成遷移腳本的過程中是不知道的,因爲有很多。我唯一擁有的是代碼 - 初始模型的初始遷移腳本和一些修改的模型。
  4. 使用初始腳本生成的現有dbs - 一切正常。下面是我如何重現該問題:
  5. 運行PS命令:添加遷移-Name初始-StartUpProjectName MyApp.Web -ProjectName MyApp.Migrations -ConfigurationTypeName「MyApp.Migrations.MyMigrationConfiguration」-ConnectionString「Data Source =。\ SQLEXPRESS; Database = demo-db; Trusted_Connection = False; User ID = x; Password = x「-ConnectionProviderName」System.Data.SqlClient「 - Works Fine
  6. 運行應用程序並創建數據庫。停止應用程序。修改模型。
  7. 運行PS命令:Add-Migration -Name MySecondMigration -StartUpProjectName MyApp.Web -ProjectName MyApp.Migrations -ConfigurationTypeName「MyApp.Migrations.MyMigrationConfiguration」-ConnectionString「Data Source =。\ SQLEXPRESS; Database = demo-db; Trusted_Connection =假;用戶ID = x;密碼= x「-ConnectionProviderName」System.Data.SqlClient「 - 繁榮。
  8. 微妙 - 移植者甚至連連接到MSSQL來檢查數據庫是否存在或有dbo .__ MigrationHistory!我進一步研究並關閉了MSSQL服務! - 如果我輸入了錯誤的數據庫名稱,或者我關閉了整個MSSQL服務器 - 沒關係,錯誤是一樣的,沒有連接。那麼它如何知道在不檢查數據庫的情況下正在進行遷移?我假設一個錯誤。
  9. 我已經在其中創建了__dbo.MigrationHistory,並具有初始遷移。
  10. 錯誤:無法生成顯式遷移,因爲以下顯式遷移未完成:[201402121953301_Initial]。在嘗試生成新的顯式遷移之前應用待處理的顯式遷移。

這裏是我的配置 - 沒有什麼特別的:

public class MyMigrationConfiguration : DbMigrationsConfiguration<MyMigrationContext> 
{ 
    public MyMigrationConfiguration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 
     MigrationsNamespace = "---"; 
     MigrationsDirectory = "---"; 
    } 
} 

這裏是至極的方法,我創建了DBS:

public void CreateOrUpdateDb(string DbName) 
     { 
      try 
      { 
       string connectionString = _connectionStringProvider.GetConnectionString(DbName); 
       DbMigrationsConfiguration cfg = CreateMigrationsConfig(connectionString); 
       cfg.AutomaticMigrationsEnabled = false; 
       cfg.AutomaticMigrationDataLossAllowed = false; 
       DbMigrator dbMigrator = new DbMigrator(cfg);        
       dbMigrator.Update(); 
      } 
      catch (MigrationsException exception) 
      { 
       _logger.Error(string.Format("Error creating database '{0}'",DbName), exception); 
      } 
     } 

我已經搜索並閱讀什麼我可以找到網絡,但大多數例子包括標準的Configuration.cs等等。沒有人解釋爲什麼我應該運行Enable-Migrations,因爲它會創建Configuration.cs,但我自己提供Configuration類,不需要這個其他類。

這裏是異常堆棧:

> System.Data.Entity.Migrations.Infrastructure.MigrationsPendingException: Unable to generate an explicit migration because the following explicit migrations are pending: [201402121953301_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration. 
    at System.Data.Entity.Migrations.DbMigrator.Scaffold(String migrationName, String namespace, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(String migrationName, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(MigrationScaffolder scaffolder) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run() 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Scaffold(String migrationName, String language, String rootNamespace, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.AddMigrationCommand.Execute(String name, Boolean force, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.AddMigrationCommand.<>c__DisplayClass2.<.ctor>b__0() 

有沒有什麼辦法來強制遷移,以使腳本沒有告訴我,有即使有一些不掛起遷移?這是EF中的100%錯誤,但我不知道如何解決。

回答

3

我們已經找到了答案 - 煤礦與Reflector.

  1. 內EntityFramework.dll的幫助下,聰明的同事還有就是類的方法
  2. System.Data.Entity.Migrations.DbMigrator
  3. 腳手架(字符串migrationName,串@namespace,布爾ignoreChanges)
  4. 這使得呼叫this.GetPendingMigrations
  5. 哪種方法調用另一個方法上ANO療法類HistoryRepository.CreateHistoryQuery(HistoryContext context, string contextKey = null)與參數contextKey == NULL
  6. 但這種方法在這裏面發生

    contextKey =!string.IsNullOrWhiteSpace(contextKey)? contextKey.RestrictTo(this._contextKeyMaxLength):this._contextKey;

並且contextKey不再爲空。 IT實際上變成了類型(YourInheritedDbMigrationConfiguration).ToString()

問題在哪裏?問題在於這樣一個事實:

  1. 我使用兩種不同的DbMigrationConfiguration類
  2. ,因爲遷移組件與應用程序的核心,這使得
  3. 他們兩個不同「完全合格的命名的」,這在分離結束
  4. 在用於生成遷移腳本的DbMigrationConfiguration的dbo._MigrationHistory表中生成兩個不同的ContextKeys。

因此,當我製作初始遷移腳本並啓動站點並且該站點應用腳本時,它可以,但在dbo._MigrationHistory中,ContextKey是「MyDbConigClass1」。之後,當我嘗試使用另一個DbMigrationConfiguration類的Add-Migration時,ContextKeys不匹配 - BOOM!

解決方案:在我的兩個配置類和一切的增加同樣ContextKey =「MyTenantDb」開始,因爲該類型的名稱不再被捲入重新工作,但DbMigrator使用我的自定義ContextKey :)