Oracle製のMySQLコネクターは、Entity Framework Core 2.1のマイグレーションに対応していない
データベースのマイグレーションを行うためにデータレイヤーのプロジェクト(Data)でマイグレーションスクリプトの追加コマンドを打ったら
cd Data migrations add First --startup-project "..\WebSite"
こんなエラーが出ました
An error occurred while accessing the IWebHost on class ‘Program’. Continuing without the application service provider. Error: Object reference not set to an instance of an object.
MSDN の デザイン時 DbContext 作成 を見ると、IDesignTimeDbContextFactory を実装したデザイン時のファクトリを用意するということだったので、こんなクラスを作って WebSite プロジェクトにに追加してみた。
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory { public DefaultDbContext CreateDbContext(string[] args) { var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("connectionStrings.json") .Build(); var builder = new DbContextOptionsBuilder() .UseMySql(configuration.GetConnectionString("idpdb")); return new DefaultDbContext(builder.Options); } }
今度はこんな感じのエラーが出た
Exception message:
System.MissingMethodException: ‘Method not found: ‘Void Microsoft.EntityFrameworkCore.Storage.Internal.RelationalParameterBuilder..ctor(Microsoft.EntityFrameworkCore.Storage.IRelationalTypeMapper)’.’
Entity Framework Core 2.1 のプレビュー時点でのこんな投稿が、どうも Oracle 版の MySql コネクターは Entity Framework の内部的なクラスを触っているようで、Entity Framework のバージョンアップについてこれていないっぽい。
EF Core 2.1 Preview 1 throws MissingMethodException when using Pomelo.EntityFrameworkCore.MySql
MySqlのフォーラムにもバグとして起票はされているけれど動きはなさそう。
https://bugs.mysql.com/bug.php?id=89855
Oracle は ODP.NET の時も Entity Framework に対する動きがだいぶ遅くてもやもやしたけれど、MySQL も同じっぽいなー。ということで、しばらくは Pomelo 版の MySQL コネクターを使ってみようと思います。
https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql
書き換えは、UseMySQL を UseMySql にするだけなので簡単ですね。
services.AddDbContext(options => options.UseMySql( Configuration.GetConnectionString("db") , builder => builder.MigrationsAssembly("ata")) );