EF核心 - 表' * .__ EFMigrationsHistory'不存在

时间:2016-11-14 20:45:31

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

我想强调的是,这是.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<User> Users { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL("connection-string-here");
            base.OnConfiguring(optionsBuilder);
        }
    }
}

错误

  

查找DbContext类...

     

使用上下文&#39; MainDbContext&#39;。

     

使用数据库&#39; db&#39;在服务器&#39; localhost&#39;。

     

MySql.Data.MySqlClient.MySqlException:Table&#39; db .__ EFMigrationsHistory&#39;不存在

     

表&#39; db .__ EFMigrationsHistory&#39;不存在   ```

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代码。之后,创建了迁移表并且一切正常。这是临时解决方案,这很糟糕。我仍然想知道&#34;正确的&#34;启用迁移的方式。

5 个答案:

答案 0 :(得分:33)

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

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

incoming[0-1]

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

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

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

Script-Migration

答案 1 :(得分:15)

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

根据此问题Dot Net Entity Framework database update doesn't create tables in mysql database,它还没有实现迁移功能。

我遵循了切换到SapientGuardian提供商的建议,这似乎是现在最好的方式。

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

答案 2 :(得分:6)

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

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

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

在这种情况下,您将收到OP

报告的错误
  

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

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

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

  • 如果删除表但使用现有数据库(之前有迁移),则update命令会给您一个例外。
  • 如果删除整个数据库,则更新命令将完美运行。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我遇到了同样的问题,但是环境略有不同。

问题是我试图在运行迁移之前使用已经存在的数据库运行迁移。

简而言之,Make sure that you DO NOT create the database yourself. Let the migrations do it for you.

来自PHP / Laravel背景,这对我来说并不明显:)


如果您对我的环境感兴趣,请在MacOS上使用MySQL服务器。