【问题标题】:EF Core - Table '*.__EFMigrationsHistory' doesn't existEF Core - 表 '*.__EFMigrationsHistory' 不存在
【发布时间】:2017-03-28 14:37:11
【问题描述】:

我想强调的是,这是 .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 类...

使用上下文“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 代码。之后创建迁移表,一切正常。这是一个不好的临时解决方案。我仍然想知道启用迁移的“正确”方式是什么。

【问题讨论】:

  • 请指定您使用的包的版本。
  • 此连接字符串是否允许您访问有权创建表的帐户?换句话说,您是否可以使用此连接字符串手动创建表?
  • @Deilan 我添加了 packages.json。当然,我拥有数据库的完全权限。一旦我手动添加表迁移工作,我的 User 模型表就会为我创建,我可以使用它进行操作。
  • @Stan 我刚刚遇到了同样的问题,ef core + mysql 试图跟随docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db Add-Migrations 工作正常,但 Update-Database 抛出此错误
  • 解决方法是在运行“dotnet ef database update”CREATE TABLE `__EFMigrationsHistory` ( `MigrationId` nvarchar(150) NOT NULL, `ProductVersion` nvarchar(32) NOT NULL, PRIMARY KEY (`MigrationId`) );之前手动创建下表

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


【解决方案1】:

将 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

【讨论】:

  • 这为我解决了问题。来自我的 +1 :)
【解决方案2】:

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

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

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

编辑:正如 cmets 中所建议的那样,Pomelo 是 2018 年初的最佳选择。自从我最初的回答以来,我已经选择了它而不是其他提供商。

【讨论】:

  • 我将此标记为答案,但我认为最好直接手动执行一次脚本。我很确定这个错误已经修复了。
  • 不幸的是,Oracle 似乎没有在意,而我上次检查时并非如此。如果您已经拥有最终的数据库结构,您可以手动执行一次脚本。就我而言,它在不断变化(系统有一些初始形状,但在 beta 阶段有很多变化,因此必须相应地更新 orm)。很高兴有人证明可以坚持使用默认提供程序。祝你好运!
  • 没有。它还没有修复。是的,Pomelo.EntityFrameworkCore.MySql 似乎是 ms 推荐的,下载量比 oracle 和 SapientGuardian 多,git 星数也多,下载频率也更高
  • 官方 MySql 包仍然存在问题,但 Pomelo 似乎可以工作
【解决方案3】:

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

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

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

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

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

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

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

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

【讨论】:

  • 这有助于 .. 使用 aspnet 核心 .. 最新更好 .. 所以总是寻找最近的回复或帖子。
  • 您的解决方案不仅仅适用于 mysql。我一直在努力想弄清楚为什么我不能让 postgres 正确迁移。在我的情况下,我可以毫无问题地在 Windows 10 上本地运行,但是在它必须运行的 RHEL6 机器上它被阻塞了。在这种情况下,删除模式(大致就像删除表)在 Windows 中有效,但在 RHEL 中无效,只有当我删除数据库本身时,事情才开始工作。
  • 只要确保您使用的用户拥有create 的服务器级权限,就可以了!
【解决方案4】:

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

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

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

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


MacOS 上的 MySQL 服务器,如果您对我的环境感兴趣的话。

【讨论】:

    【解决方案5】:

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

    刚刚添加的包:Install-Package SapientGuardian.EntityFrameworkCore.MySql 并且迁移成功了!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多