EF Core – 表’* .__ EFMigrationsHistory’不存在

我想强调这是.NET Core,而关于EF 6.0的线程不适用于这个问题

我创建了我的DbContext并将其添加到DI中,但是当我执行dotnet ef database update -v它不想创建迁移表__EFMigrationsHistory

是否还有其他一些我应该先做的命令,或者这是EF Core MySQL适配器的错误?

MainDbContext

 using Microsoft.EntityFrameworkCore; using MySQL.Data.EntityFrameworkCore.Extensions; using Web.Models; namespace Web.Infrastructure { public class MainDbContext : DbContext { public DbSet Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySQL("connection-string-here"); base.OnConfiguring(optionsBuilder); } } } 

错误

查找DbContext类…

使用上下文’MainDbContext’。

在服务器’localhost’上使用数据库’db’。

MySql.Data.MySqlClient.MySqlException:表’db .__ EFMigrationsHistory’不存在

表’db .__ EFMigrationsHistory’不存在“`

project.json

 { "dependencies": { "Microsoft.NETCore.App": { "version": "1.0.1", "type": "platform" }, "Microsoft.AspNetCore.Diagnostics": "1.0.0", "Microsoft.AspNetCore.Mvc": "1.0.1", "Microsoft.AspNetCore.Razor.Tools": { "version": "1.0.0-preview2-final", "type": "build" }, "Microsoft.AspNetCore.Routing": "1.0.1", "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", "Microsoft.AspNetCore.StaticFiles": "1.0.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", "Microsoft.Extensions.Configuration.Json": "1.0.0", "Microsoft.Extensions.Logging": "1.0.0", "Microsoft.Extensions.Logging.Console": "1.0.0", "Microsoft.Extensions.Logging.Debug": "1.0.0", "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0", "BundlerMinifier.Core": "2.2.301", "WebMarkupMin.AspNetCore1": "2.2.1", "MySql.Data.EntityFrameworkCore": "7.0.6-IR31", "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final" }, "tools": { "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final", "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final", "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" }, "frameworks": { "netcoreapp1.0": { "imports": [ "dotnet5.6", "portable-net45+win8" ] } }, "buildOptions": { "emitEntryPoint": true, "preserveCompilationContext": true }, "runtimeOptions": { "configProperties": { "System.GC.Server": true } }, "publishOptions": { "include": [ "wwwroot", "**/*.cshtml", "appsettings.json", "web.config" ] }, "scripts": { "prepublish": [ "bower install", "dotnet bundle" ], "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] } } 

临时解决方案

通过执行dotnet ef migrations script我获得了可以直接在MySQL中执行的SQL代码。 之后,创建了迁移表并且一切正常。 这是临时解决方案,这很糟糕。 我仍然想知道启用迁移的“正确”方法是什么。

使用标准Oracle提供程序时遇到同样的问题。

根据这个问题, Dot Net Entity Framework数据库更新不会在mysql数据库中创建表,它还没有实现迁移function。

我按照建议切换到SapientGuardian提供商,它似乎是现在最好的方式。

编辑:正如评论中所建议的,Pomelo是2018年开始时的最佳选择。自从我的原始答案以来,我选择了其他供应商。

将Mark G的评论转变为答案。

创建__EFMigrationsHistory表后,应运行其余的更新。

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

或者,生成迁移脚本并在程序包管理器控制台中使用此命令手动应用于数据库:

 Script-Migration 

如果需要生成所有脚本,可以使用以下命令:

 Script-Migration -from 0 

我遇到了同样的问题,OP上下文可能略有不同,但为了完整起见,这是我的答案。

您遇到此问题的方法之一是:

  • 您创建迁移并更新数据库,
  • 稍后由于某种原因,您丢弃表(而不是数据库)并尝试再次运行update-databse命令。

在这种情况下,您将收到OP报告的错误

MySql.Data.MySqlClient.MySqlException:表’db .__ EFMigrationsHistory’不存在

在这种情况下,解决方案是删除整个数据库 。 之后,update-databse命令运行成功。

我不确定它是否只与mysql有关,但要恢复:

  • 如果删除表但使用现有数据库(具有以前的迁移),则update命令将为您提供exception。
  • 如果删除整个数据库 ,update命令将完美运行。

与官方Oracle MySQL提供商有同样的问题。

刚刚添加了包:Install-Package SapientGuardian.EntityFrameworkCore.MySql和迁移工作!