ちゃんとした記事というよりはメモです。雑記です。
やりたかったこと
.NET 6 で EFCore 7 つかってMySQL 8.0.31に接続したかった
詰まったところ
dev MySQLを参考に書いてみたけど動かない。別のSQLクライアントから接続できるのは確認済み
具体的には、以下のような感じに接続文字列書いてるのに 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
を使うのが正しかった。
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のドキュメントが見つかった
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のドキュメントを見つける
ここで先の Pomelo.EntityFrameworkCore.MySql
の存在を知る。
README通りに書いてみたら接続できた。
3. MySQLのドキュメントを読み返した
なんでdev MySQLの方はでけへんねんと思ったが…
General Requirements for EF Core Support - Connector/NET 8.0
Entity Framework Core packages:
-- https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html
EFCore 6が対象だよってちゃんと書いてあった。目がついてませんでした。すいませんでした。
おわり
やったことのところ、ざっくり書いてるけど2時間ぐらいかかりました。むずかしいね。
MySQLにこだわりはなく、なんならSQLiteでもよかったんだよね…。
クリスマスイブになにやってんねんという感じです。