このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

【M1 Mac】dotnet ef ツールで、MySQLを scaffoldする。

C#

2021.10.17

この記事は最終更新日から1年以上が経過しています。

どもです。

最近もっぱらC#を書いている日々です。

なぜかと言うと長いので割愛させて頂きますが、ざっと説明すると、Webの未来の一つとしてWebassemblyの技術があるかと思いますが、そのWebassemblyを用いて、UnityとWebの連携を色々と模索しながら行っているうちに、UnityやらBlazorやらを扱っている訳です。

で、こちらのBlazorの書籍を進めていたところぶつかったのが、「第9章 データベースアクセス」の章。

created by Rinker
¥2,772 (2024/04/25 21:44:23時点 Amazon調べ-詳細)

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のやり方もほぼ同様ですが、手順なども追って記載できればと思っております。

ではでは、またまた。

Comment

Related Article

Blazor WebAssemblyでAWS SDKを使用しようとしてハマった話

2021.12.27

【M1 Mac】dotnet ef ツールで、MySQLを scaffoldする。

2021.10.17

CATEGORY LIST

LATEST NEWS

Rust - Actix Web mongo ユーザー登録 JWT認証

Rust

2024.03.24

Rust - Actix Web JWT 認証認可 APIの作成

Rust

2024.02.25

Rust - Actix Web × JSON 静的ファイルをAPIで返却

Rust

2024.01.19

Rust - Actix Web × MongoDB環境をサクッと起動

Rust

2024.01.18

5分で学ぶ RustでWave Function Collapse (波動関数崩壊アルゴリズム)

Rust

2024.01.15

LLaMAモデル GGMLフォーマット(llama.cpp)をRustフレームワーク Leptosを用いて M1MacMiniでサクッと動かす。

Rust

2024.01.11

2024年 狙っているモバイルノートPC

tool

2024.01.07

MacOS XcodeにSDL2を追加

tool

2023.12.26

php 7.4にアップデート

PHP

2023.12.24

5分で覚える Flutter Flameで作る Wave Function Collapse - 波動関数崩壊アルゴリズム

AI・Bot・algorithm

2023.12.20

Flutter - Flameでゲーム作成 (キャラクターの移動)

Flutter

2023.07.23

Flutterで作る ChatGPT Prompt Manager

Flutter

2023.07.12

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US