web-dev-qa-db-ja.com

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<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コードが得られます。その後、移行テーブルが作成され、すべてが正常に機能します。これは一時的な解決策であり、悪いことです。移行を可能にする「正しい」方法は何だと思いますか。

23
sed

マークGのコメントを答えに変える。

__EFMigrationsHistoryテーブルが作成されると、残りの更新が実行されます。

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

または、パッケージマネージャーコンソールで次のコマンドを使用して、移行のスクリプトを生成し、データベースに手動で適用します。

Script-Migration

すべてのスクリプトを生成する必要がある場合は、次のコマンドを使用できます。

Script-Migration -from 0
39
Derrick

標準のOracleプロバイダーを使用中に同じ問題が発生しました。

この質問によると Dot Net Entity Frameworkデータベースの更新ではmysqlデータベースにテーブルが作成されません 移行機能はまだ実装されていません。

私はSapientGuardianプロバイダーに切り替えた提案に従いましたが、今が最善の方法だと思われます。

編集:コメントで示唆されているように、Pomeloは2018年以降の最良のオプションです。元の回答以来、他のプロバイダーよりも選択しました。

16
Peuczynski

私は同じ問題に遭遇します、OPコンテキストはわずかに異なるかもしれませんが、完全性のためにここに私の答えがあります。

この問題に遭遇する可能性のある方法の1つは、次の場合です。

  • 移行を作成してデータベースを更新し、
  • 何らかの理由で後で(データベースではなく)テーブルを削除し、update-databseコマンドをもう一度実行してみます。

その場合、OPによって報告されたエラーが表示されます

MySql.Data.MySqlClient.MySqlException:テーブル 'db .__ EFMigrationsHistory'は存在しません

この場合の解決策は、データベース全体を削除することですです。その後、update-databseコマンドが正常に実行されます。

Mysqlのみに関連するかどうかはわかりませんが、再開するには:

  • テーブルを削除するで、既存のデータベース(以前の移行があった)を使用する場合、更新コマンドは例外を提供します。
  • データベース全体を削除する場合、更新コマンドは完全に実行されます。
7
Ferox

公式のOracle MySQLプロバイダーにも同じ問題がありました。

パッケージを追加しました:Install-Package SapientGuardian.EntityFrameworkCore.MySqlおよび移行が機能しました!

0
Daimonion