1

MySQLデータベースにリンクされたCode First Entity Framework 6を​​使用するAsp.Net MVC 5アプリケーションがあります。EF6 with MySQL。指定されたキーが辞書に存在しません

初めてデータベースを作成したときに正常に動作します。しかし、私がモデルに変更を加えると、マイグレーションが追加されます。 (Update-Database)の後にエラーが表示されます。

これはエラーです:

 PM> Update-Database 
     System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. 
      at System.Collections.Generic.Dictionary`2.get_Item(TKey key) 
      at MySql.Data.MySqlClient.MySqlConnectionStringBuilder.<>c.<.cctor>b__2_7(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender) 
      at MySql.Data.MySqlClient.MySqlConnectionStringBuilder.get_Item(String keyword) 
      at MySql.Data.MySqlClient.MySqlConnectionStringBuilder.GetConnectionString(Boolean includePass) 
      at MySql.Data.MySqlClient.MySqlConnection.get_ConnectionString() 
      at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<GetConnectionString>b__12(DbConnection t, DbConnectionInterceptionContext`1 c) 
      at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget, TInterceptionContext, TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) 
      at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.GetConnectionString(DbConnection connection, DbInterceptionContext interceptionContext) 
      at System.Data.Entity.Internal.InternalConnection.GetStoreConnectionString(DbConnection connection) 
      at System.Data.Entity.Internal.InternalConnection.OnConnectionInitialized() 
      at System.Data.Entity.Internal.EagerInternalConnection..ctor(DbContext context, DbConnection existingConnection, Boolean connectionOwned) 
      at System.Data.Entity.DbContext..ctor(DbConnection existingConnection, Boolean contextOwnsConnection) 
      at System.Data.Entity.Migrations.History.HistoryContext..ctor(DbConnection existingConnection, String defaultSchema) 
      at MySql.Data.Entity.MySqlHistoryContext..ctor(DbConnection existingConnection, String defaultSchema) 
      at code_first_mysql.Migrations.Configuration.<>c.<.ctor>b__0_0(DbConnection conn, String schema) in C:\Users\User\Documents\Tree\New Backend\code first mysql\Migrations\Configuration.cs:line 16 
      at System.Data.Entity.Migrations.History.HistoryRepository.CreateContext(DbConnection connection, String schema) 
      at System.Data.Entity.Migrations.History.HistoryRepository.<GetUpgradeOperations>d__16.MoveNext() 
      at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source) 
      at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) 
      at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b() 
      at System.Data.Entity.Migrations.Infrastructure.MigratorScriptingDecorator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
      at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 
      at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 
      at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 
      at System.Data.Entity.Migrations.Infrastructure.MigratorScriptingDecorator.ScriptUpdate(String sourceMigration, String targetMigration) 
      at System.Data.Entity.Migrations.Design.ToolingFacade.ScriptUpdateRunner.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.ScriptUpdate(String sourceMigration, String targetMigration, Boolean force) 
      at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0() 
      at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
     The given key was not present in the dictionary. 

は、これらは私のMySQLの設定クラスです:あなたは、エラーの最初の行からわかるように

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     SetSqlGenerator("MySql.Data.MySqlClient", new MySqlMigrationSqlGenerator()); 
     SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); 
     CodeGenerator = new MySqlMigrationCodeGenerator(); 
    } 

    protected override void Seed(ApplicationDbContext context) 
    {} 
} 


public class MySqlConfiguration: DbConfiguration 
{ 

    public MySqlConfiguration() 
    { 
     SetHistoryContext("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); 
    } 

} 



public class MySqlHistoryContext : HistoryContext 
{ 
    public MySqlHistoryContext(DbConnection existingConnection, string defaultSchema) : base(existingConnection, defaultSchema) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired(); 
     modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired(); 
    } 
} 

public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext> 
{ 

    public void InitializeDatabase(ApplicationDbContext context) 
    { 
     if (!context.Database.Exists()) 
     { 
      // if database did not exist before - create it 
      context.Database.Create(); 
     } 
     else 
     { 
      // query to check if MigrationHistory table is present in the database 
      var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
      string.Format(
       "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'", "mydb")); 

      // if MigrationHistory table is not there (which is the case first time we run) - create it 
      if (migrationHistoryTableExists.FirstOrDefault() == 0) 
      { 
       context.Database.Delete(); 
       context.Database.Create(); 
      } 
     } 
    } 
} 
+0

は接続文字列の問題のようです。 dbContextは、起動時とは異なるプロジェクトにありますか? –

+0

私は1つのプロジェクトしか持っていません。また、私はdbContextを1か所に持っています。助けてください。 – sa94

+0

パッケージマネージャコンソールで移行を実行すると、データベースはすでに作成されていますか?そうであれば、おそらくあなたは '__MigrationHistory'に関連するCode Firstの移行のためのいくつかのステップを見逃しています。 –

答えて

1

MySql.Data.MySqlClient.MySqlConnectionStringBuilder.<>c.<.cctor>b__2_7(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender) at MySql.Data.MySqlClient.MySqlConnectionStringBuilder.get_Item(String keyword)

エラーConnectionStringと関係があります。問題はConnectionStringには読み取れない鍵が含まれていることです。

それだけ

  1. サーバーを持つようにConnectionStringをクリーンアップしよう
  2. ユーザID
  3. データベースは
  4. 私の場合は

ConnectionStringは余分を持っていたパスワード

  • キーintegrated security。これが取り除かれたときUpdate-Databaseは正常に動作し始めました。ただし、場合によっては、これがエラーの原因となったキーではない場合もあります。

    私が提案して保証した解決策は、ConnectionStringに行き、上記の4つのキーだけが含まれるように簡略化します。

  • 関連する問題