【M1 Mac】dotnet ef ツールで、MySQLを scaffoldする。
2021.10.17
この記事は最終更新日から1年以上が経過しています。
どもです。
最近もっぱらC#を書いている日々です。
なぜかと言うと長いので割愛させて頂きますが、ざっと説明すると、Webの未来の一つとしてWebassemblyの技術があるかと思いますが、そのWebassemblyを用いて、UnityとWebの連携を色々と模索しながら行っているうちに、UnityやらBlazorやらを扱っている訳です。
で、こちらのBlazorの書籍を進めていたところぶつかったのが、「第9章 データベースアクセス」の章。
9.2 SQLSeverの利用で、ずっとMySQLと思って進めていたのですが、全然うまくいかず。。
よくよく見ると、「Microsoft SQL Server」っていうのがあって、それではないかw
そういうのがあるのか。。(Microsoftのエコシステムにあまり触れていないので。。)
Parallels Desktop(Arm windows)のVisual Studioでやり直すと、すんなりいきました。
で、本題なのですが、M1 Mac(Intel Macも同様)で開発進めたい上に、dotnet ef ツールで「MySQL」をscaffoldしたい。
と言ったところです。
上記の本書では、MySQLのscaffoldはできないと記載されていましたが、調べるとできそうで、やってみたところ成功しましたので、そのログでもと。
ベースは、MySQLの公式ドキュメントの 7.2.2 Scaffolding an Existing Database in EF Core を参考にしていますが、そのままだと失敗していたので、バージョンを変更しています。
MySQLデータ準備
MySQLのデータを準備します。こちらも詳細は割愛させていただきます。
上記のサンプルデータのように、データベース名は「blazordb」、テーブルは「books」で作成しております。
データベース名、テーブル名などMySQL側の設定やデータは任意でお願いします。
.NET Core CLIを用いてMySQLをScaffolding
まずはともあれ、dotnetコマンドが使用できる状態にします。
dotnet efツールを使用します。
$ dotnet ef
上記のコマンドで以下の表示になればツールは使用できます。
表示しなければ、dotnet efをグローバルインストールします。
$ dotnet tool install —global dotnet-ef
とりあえず、MySQLをScaffoldingしたいだけなので、小さく .NET Core command-line interface (CLI)プロジェクトとして開始します。
ディレクトリが作成されたらそちらに移動。
$ dotnet new console -o sakilaConsole $ cd sakilaConsole
続いて、EFコア用の MySQL NuGet パッケージである「MySql.EntityFrameworkCore」を追加します。
ここで、公式のドキュメントに記載しているパッケージだとメソッドがないぞ。とエラー吐いていましたので、特にバージョン指定せず、最新を入れることによって、エラーが回避されました。
「MySql.EntityFrameworkCore」「MySql.Data.EntityFrameworkCore」「Microsoft.EntityFrameworkCore.Tools」をそれぞれ追加。
$ dotnet add package MySql.EntityFrameworkCore $ dotnet add package MySql.Data.EntityFrameworkCore $ dotnet add package Microsoft.EntityFrameworkCore.Tools
「dotnet restore」コマンドで、プロジェクトファイルで指定されている依存関係やプロジェクト固有のツールを復元します。
$ dotnet restore
MySQL接続文
dotnet efツールで、MySQLをScaffoldingする為に、必要なNuGet パッケージを追加しましたので、dotnet efで実際に行っていきます。
Scaffoldingする為に必要なコマンドはMySQL公式ドキュメントに記載されている以下のとおりとなります。
$ dotnet ef dbcontext scaffold "connection-string" MySql.EntityFrameworkCore -o sakila -f
ここで、記載されている「”connection-string”」箇所に、MySQL接続文字列がはいるのですが、MySQLの公式ドキュメントでの接続文字列のサンプルは、以下のようになっております。
"server=127.0.0.1;uid=root;pwd=12345;database=test"
このように、MySQL接続文字列を指定するので、お使いの環境に合わせて変更します。
「localhost」の文字列でも問題なかったし、他のサイトの例をみてみると「Server」など頭が大文字、「UserId」など文字列が異なる指定の例が書かれていますが、そちらでも実行できたので、ある程度バリエーションが存在しているようです。
$ dotnet ef dbcontext scaffold "server=localhost;database=blazordb;uid=root;password=" MySql.EntityFrameworkCore -o sakila -f
実行し、
Build started... Build succeeded.
と表示し、エラーがなければ、Scaffoldingされたモデルファイルなどが生成されます。
中身を確認すると、以下のようにEntityクラスファイルの生成や、
Book.cs
using System; using System.Collections.Generic; #nullable disable namespace sakilaConsole.sakila { public partial class Book { public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public int Price { get; set; } public string Publisher { get; set; } } }
データコンテキストファイルの生成が成功されているのが確認できます。
blazordbContext.cs
using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; #nullable disable namespace sakilaConsole.sakila { public partial class blazordbContext : DbContext { public blazordbContext() { } public blazordbContext(DbContextOptions<blazordbContext> options) : base(options) { } public virtual DbSet<Book> Books { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263. optionsBuilder.UseMySQL("server=localhost;database=blazordb;uid=root;password="); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Book>(entity => { entity.ToTable("books"); entity.Property(e => e.Id) .HasColumnType("int unsigned") .HasColumnName("id"); entity.Property(e => e.Author) .IsRequired() .HasMaxLength(50) .HasColumnName("author") .HasDefaultValueSql("''"); entity.Property(e => e.Price).HasColumnName("price"); entity.Property(e => e.Publisher) .HasMaxLength(50) .HasColumnName("publisher"); entity.Property(e => e.Title) .IsRequired() .HasMaxLength(50) .HasColumnName("title") .HasDefaultValueSql("''"); }); OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); } }
M1 Macでも上記のように、dotnet efツールによるMySQLのscaffoldが行えるのが確認できてよかったです。
Visual Studioのやり方もほぼ同様ですが、手順なども追って記載できればと思っております。
ではでは、またまた。