【问题标题】:EF6 with MySQL. The given key was not present in the dictionaryEF6 与 MySQL。字典中不存在给定的键
【发布时间】:2017-04-18 11:20:47
【问题描述】:

我有使用 Code First Entity Framework 6 的 Asp.Net MVC 5 应用程序链接到 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();
            }
        }
    }
}

【问题讨论】:

  • 看起来像一个连接字符串问题。您的 dbContext 是否在与启动项目不同的项目中?
  • 我只有一个项目,我的 dbContext 也在一个地方。请帮忙..
  • 在使用包管理器控制台运行迁移时数据库是否已经创建?如果是这样,您可能错过了与 __MigrationHistory 相关的 Code First 迁移的一些步骤。
  • 我没听明白,第一个初始化工作正常。但其他人没有。我还添加了迁移历史

标签: mysql asp.net asp.net-mvc entity-framework entity-framework-6


【解决方案1】:

从错误的第一行可以看出,

MySql.Data.MySqlClient.MySqlConnectionStringBuilder.c.<.cctor>b__2_7(MySqlConnectionStringBuilder msb,MySqlConnectionStringOption 发件人) 在 MySql.Data.MySqlClient.MySqlConnectionStringBuilder.get_Item(字符串 关键字)

错误与ConnectionString 有关。问题是ConnectionString 包含无法读取的键。

尝试清理ConnectionString,使其只有

  1. 服务器
  2. 用户名
  3. 密码
  4. 数据库

在我的例子中,ConnectionString 有一个额外的密钥 integrated security。当它被删除时,Update-Database 开始正常工作。但是,根据您的情况,这可能是也可能不是导致错误的关键。

因此,我再次提出并保证解决方案,通过 ConnectionString 并简化它,使其仅包含上述 4 个键。

【讨论】:

    【解决方案2】:

    Bug 75172 这是 6.9.4 版本中报告的错误,但我在 6.9.11 中进行了审查。

    【讨论】:

      【解决方案3】:

      不要使用最新的 mysql 工具

      1. 关闭 Visual Studio 2017

      2. 卸载mysql-for-visualstudio 2.0.5 然后,安装mysql-for-visualstudio 1.2.8

      3. 卸载 mysql-connector-net-8.0.17 然后,安装 mysql-connector-net-6.9.10。 在中找到mysql.data.dll、MySql.Data.Entity.EF6.dll %Program Files (x86)%\MySQL\MySQL Connector Net 6.9.10\Assemblies\v4.5 添加到参考文献

      4. 在引用中打开 nuget,将 EntityFramework 6 降级为 EntityFramework 5

      【讨论】:

        【解决方案4】:

        这对我有用:关闭你的视觉工作室并

        1. 到这个文件夹 C:\Users[你的用户]\AppData\Roaming\Microsoft\VisualStudio\16.0_befcda98\ServerExplorer

        2. 然后删除文件DefaultView.SEView

        3. 打开您的视觉工作室,然后重试。

        【讨论】:

        • 有数百万种方法可以得到这个异常。这并不意味着它们都与这个问题有关。
        猜你喜欢
        • 2012-02-18
        • 1970-01-01
        • 2016-08-14
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多