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 が生成される。テーブル追加や列変更のたびに再実行すればスキーマとコードのずれが減る。