EF Core 8 の Scaffolding で既存 DB からモデルを生成する
テーブル定義は SQL 側で書き、アプリのコードからは ORM でオブジェクトとして扱いたい。だが既存 DB に合わせて手でモデルを起こすのは手間だし、スキーマ変更のたびに追従が面倒。EF Core の dbcontext scaffold はこれを 1 コマンドで片付ける。
EntityFramework Core
Entity Framework (EF) Core は人気の Entity Framework データ アクセス テクノロジの軽量版であり、拡張性に優れ、オープン ソースで、プラットフォームに依存しません。
EF Core は、次のようなオブジェクト リレーショナル マッパー (O/RM) として機能します。
.NET 開発者が .NET オブジェクトを使用してデータベースを操作できるようにする。
通常記述しなければならないデータアクセス コードの多くを不要にする。
https://learn.microsoft.com/ja-jp/ef/core/
Scaffolding
プロジェクトの初期構造や定型コードを自動生成する手法。EF Core では既存 DB のスキーマからエンティティクラスと DbContext を吐き出すコマンドを指す。
環境
- C# (.NET 9 preview.3)
- Microsoft.EntityFrameworkCore 8.0.4
- Windows
- MySQL
- 追加パッケージ:
Microsoft.EntityFrameworkCore.Design/Pomelo.EntityFrameworkCore.MySql
.NET CLI が使える状態で C# プロジェクトを生成済み。以降のコマンドは .csproj があるディレクトリで実行する。
準備
dotnet ef を叩いてユニコーンの AA が出るなら OK。
dotnet ef
_/\__
---==/ \\
___ ___ |. \|\
| __|| __| | ) \\\
| _| | _| \_/ | //|\\
|___||_| / \\\/\\
出なければ dotnet-ef をグローバルに入れる。
dotnet tool install --global dotnet-ef
パッケージ
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Pomelo.EntityFrameworkCore.MySql
Scaffold 実行
host / database / user / password は環境に合わせる。-o にはエンティティを吐き出すディレクトリを指定する。
dotnet ef dbcontext scaffold "server={host};database={database};user={user};password={password};" Pomelo.EntityFrameworkCore.Mysql -o {directory}
これで指定ディレクトリに全テーブルぶんのエンティティクラスと DbContext が生成される。テーブル追加や列変更のたびに再実行すればスキーマとコードのずれが減る。