【问题标题】:EF Core `update-database` on MySql fails with `__EFMigrationsHistory' doesn't exist`MySql 上的 EF Core `update-database` 因 `__EFMigrationsHistory' 不存在而失败
【发布时间】:2017-09-07 07:08:44
【问题描述】:

我在 .net core 1.1 中使用个人用户帐户身份创建新项目。我在 Startup.cs 中添加 MySql 提供程序:

services.AddDbContext<ApplicationDbContext>(options => 
        options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));

但是当我尝试做update-database 时,我得到这样的错误:

MySql.Data.MySqlClient.MySqlException: Table 'cloud.__EFMigrationsHistory' doesn't exist    at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
    at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.EntityFrameworkCore.Storage.Internal.MySQLRelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean closeConnection)
    at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
    at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.GetAppliedMigrations() 
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType) 
   at Microsoft.EntityFrameworkCore.Tools.Cli.DatabaseUpdateCommand.<>c__DisplayClass0_0.<Configure>b__0()
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args)
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args)
 Table 'cloud.__EFMigrationsHistory' doesn't exist 

我该怎么办?

【问题讨论】:

  • 这与 ASP.NET Core 或 MySQL 无关。这是当您尝试 update 而不是创建数据库时出现在 all 版本中的实体框架错误。该消息解释了原因 - EF 用于检查已应用哪些迁移的迁移历史记录表丢失
  • 但是为什么会出现这个错误?这是在模板中添加了标准 asp.net 核心标识的新项目。
  • 因为 provider 可能有 bug 而没有创建表。发生例如2 years ago with the Postgres provider
  • 这不是在.net core 1.1 中使用带有asp.net 身份的MySql 吗?

标签: c# mysql entity-framework asp.net-core entity-framework-core


【解决方案1】:

这与 ASP.NET Identity 或 ASP.NET Core 无关。这通常与实体框架有关。当您更新数据库时,EF 使用__EFMigrationsHistory 记录执行了哪些迁移,以便将来不再执行它们。

此功能由数据库提供程序实现,而不是 EF 本身。至少有一种情况是 PostgresSQL 的 Npgsql 提供程序didn't create the table

解决方案很简单 - 自己创建表:

CREATE TABLE `__EFMigrationsHistory` 
( 
    `MigrationId` nvarchar(150) NOT NULL, 
    `ProductVersion` nvarchar(32) NOT NULL, 
     PRIMARY KEY (`MigrationId`) 
);

更新

another similar question 在 2016 年。这是官方 MySQL 提供商的错误。解决方法是创建表。也不是唯一一个。例如,异步操作是通过在不同的线程上运行来伪造的。

我建议您调查第三方 MySQL 提供商,例如 Pomelo.EntityFrameworkCore.MySql。他们found and fixed 一年前的迁移历史错误。

鉴于 MySQL 的所有者是 Oracle,不要期望连接器有很大的进步。或者数据库。

【讨论】:

  • 我使用 Pomelo.EntityFrameworkCore.MySql 及其开始工作。谢谢!
  • 哇,2020 年……这个“官方”提供商完全是个笑话。只需使用 Oracle 提供程序直接遇到此错误。现在我很想看到有人试图说服我这不是政治性的。
  • @Jammer 让我这样说...... Oracle 是否从 MySQL 中获得任何许可资金?这就是为什么像真实备份这样的关键特性在 5000 美元/年的企业版中,以及为什么像 MySQL 8 中的 ROW_NUMBER() 这样的分析和窗口函数需要 8 年才问世。你被 Sql Server Express 宠坏了
  • 我从未听说过工作代码被称为“被破坏”。
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 2019-05-02
  • 2021-10-20
  • 2018-08-31
  • 2021-02-19
  • 2020-05-18
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多