たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

EFCore 7 でMySQLに繋ごうとしてた話

ちゃんとした記事というよりはメモです。雑記です。

やりたかったこと

.NET 6 で EFCore 7 つかってMySQL 8.0.31に接続したかった

詰まったところ

dev MySQLを参考に書いてみたけど動かない。別のSQLクライアントから接続できるのは確認済み

dev.mysql.com

具体的には、以下のような感じに接続文字列書いてるのに Method not found: 'System.String Microsoft.EntityFrameworkCore.Diagnostics.RelationalStrings.get_NoConnectionOrConnectionString()'.' とかいう例外で接続できなかった

public class HogeContext: DbContext
{
  public DbSet<Foo> Foo { get; set; }

  protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder) {
    var builder = new MysqlConnectionStringBuilder{ Server = "localhost", Port = 50001, UserID = "user", Password = "password", Database = "database" };
    optionBuilder.UseMySQL(builder.ConnectionString)
  }
}

using var db = new HogeContext();
db.Database.EnsureCreated(); // <- ここで例外

解決策

Pomelo.EntityFrameworkCore.MySql を使うのが正しかった。

github.com

var hostBuilder = Host.CreateDefaultBuilder(args)
    .ConfigureServices(sc =>
    {
        sc.AddDbContext<HogeContext>(options =>
        {
            options.UseMySql(
                new MySqlConnectionStringBuilder
                {
                    Server = "localhost", Port = 50001, UserID = "user", Password = "password", Database = "database"
                }.ConnectionString,
                new MySqlServerVersion(new Version(8, 0, 31))
            );
        });
    });

using var host = hostBuilder.Build();
using var scope = host.Services.CreateScope();

var db =
    scope.ServiceProvider.GetService<HogeContext>()
    ?? throw new NoNullAllowedException();
db.Database.EnsureCreated(); // <- 例外でなかった!ハッピー!

やったこと

このままだとつらかった…っていう日記になるので、解決までの道のりを書いておこうと思う。これも何の役に立つんだって感じですが。

リンクいろいろ貼ってるけど、時が経つと今日(2022年12月24日)のとは内容が変わるかもしれない

1. get_NoConnectionOrConnectionString() でggった

MSのドキュメントが見つかった

learn.microsoft.com

EFCore 6のドキュメントだったので、ドロップダウンからEFCore 7に変えたら、The requested page is not available for Entity Framework Core 7.0. と言われてしまった。

Applies to を見てみたら 3.0, 3.1, 5.0, 6.0 だったのでなんかおかしいなって思った

2. EFCore 7 MySQL とかで雑にggった

MSのドキュメントを見つける

learn.microsoft.com

ここで先の Pomelo.EntityFrameworkCore.MySql の存在を知る。 README通りに書いてみたら接続できた。

3. MySQLのドキュメントを読み返した

なんでdev MySQLの方はでけへんねんと思ったが…

General Requirements for EF Core Support - Connector/NET 8.0

  • MySQL 8.0 Server (or MySQL 5.7)

  • Entity Framework Core packages:

    • MySql.EntityFrameworkCore 6.0.0+m8.0.2x (Connector/NET 8.0.28 and later)
    • MySql.EntityFrameworkCore 5.0.0+m8.0.2x and 3.1.10+m8.0.2x (Connector/NET 8.0.23 and later)
    • MySql.Data.EntityFrameworkCore 8.0.2x (Connector/NET 8.0.22 and earlier)

-- https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html

EFCore 6が対象だよってちゃんと書いてあった。目がついてませんでした。すいませんでした。

おわり

やったことのところ、ざっくり書いてるけど2時間ぐらいかかりました。むずかしいね。

MySQLにこだわりはなく、なんならSQLiteでもよかったんだよね…。

クリスマスイブになにやってんねんという感じです。