2017.9.5
2020.1.7

.NET CoreでMySQLベースのマイグレーションができない

.NET Core + Entity Framewok + MySQLでマイグレーションに対応した環境(コードファースト)を構築しようとしましたが、マイグレーション用のファイル(クラス)は出力できたのに、実際のDBに反映することができなかったので、その時のメモです。

マイグレーションは初めてだったこともあってこちらの不手際で動作しなかった可能性が十分にあるので、あくまで参考程度にしてください。

目次

  • 環境
  • 手順
  • コード(手順④)
  • Add-Migration Initial実行時のエラーと対応(手順⑤)
  • Update-Database -Verbose実行時のエラー(手順⑥)
  • 最後に

環境

  • Visual Studio 2017 Community
  • Microsoft.EntityFrameworkCore 1.1.2
  • Microsoft.EntityFrameworkCore.Design 1.1.2
  • Microsoft.EntityFrameworkCore.Tools 1.1.1
  • MySql.Data.EntityFrameworkCore 8.0.8-dmr
  • MySql.Data.EntityFrameworkCore.Design 8.0.8-dmr
  • MySQL 5.7

手順

① コンソールアプリケーションでプロジェクト作成

② NuGetパッケージマネージャーで必要なパッケージをインストール

③ 動作確認用のDB、ユーザーを作成

④ 動作確認用のDbContext作成

⑤ パッケージマネージャーコンソールから「Add-Migration Initial」を実行

⑥ パッケージマネージャーコンソールから「Update-Database -Verbose」を実行

コード(手順④)

コンソールアプリケーションプロジェクト生成時に初期配置されている「program.cs」を以下のように書き換えます。


using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore.Extensions;

namespace OarApp.Migration
{
    //モデル
    public class Sample
    {
        public int id { get; set; }
        public string name { get; set; }
    }

    //DbContext
    public class MyContext : DbContext
    {
        public DbSet<Sample> Samples { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL(@"server=localhost;database=testdb;userid=testuser;pwd=testpassword;sslmode=none;");
        }
    }

    //メイン
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new MyContext())
            {
            }
        }
    }
}

Add-Migration Initial実行時のエラーと対応(手順⑤)

以下はパッケージマネージャーコンソールから「Add-Migration Initial」を実行した際に出力されたエラーと対応した内容になります。

Your startup project 'プロジェクト名' doesn't reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.

必要なパッケージがインストールされていない場合に出力されます。


No DbContext was found in assembly 'プロジェクト名'.Ensure that you're using the correct assembly and that the type is neither abstract nor generic.

プロジェクトに「DbContext」がない場合に出力されます。


Method 'Clone' in type 'MySQL.Data.EntityFrameworkCore.Infraestructure.Internal.MySQLOptionsExtension' from assembly 'MySql.Data.EntityFrameworkCore, Version=8.0.8.0, Culture=neutral, PublicKeyToken=c1234fc56789c33d' does not have an implementation.

Microsoft.EntityFrameworkCore系パッケージのバージョン「2.0」で試したら出力されます。おそらくMySqlのパッケージの対応がまだなのだと思います。バージョンを「1.1.2」にダウングレードすると出なくなりました。


System.ArgumentNullException: Value cannot be null.Parameter name: contentRootPath

パッケージ「Microsoft.EntityFrameworkCore.Tools」をインストールしたら出なくなりました。

コマンドの実行に成功すると、以下のようにファイルが作成されます。

Update-Database -Verbose実行時のエラー(手順⑥)

以下はパッケージマネージャーコンソールから「Update-Database -Verbose」を実行した際に出力されたエラーです。

MySql.Data.MySqlClient.MySqlException (0x80004005): Table 'DB名.__efmigrationshistory' doesn't exist

このエラーが解決しなかったので、今回のマイグレーション対応は諦めました。

最後に

.NET coreでなければMySQLでもマイグレーションは可能なようなので、Oracleが提供しているパッケージの対応待ちなのだと思います。(重ねて言いますがこちらの不手際という可能性も十分にあります)

ASP.NET Core】関連記事