.NET Framework のプロジェクトで EF Core の Scaffold を使いテストデータを投入する

昨年は .NET Core のプロジェクトだったので、特に苦労なく EF Core の Scaffold で既存の DB から Entity を生成し、それでテストデータを作成するというのができていました。(.NET Core で作成してはいるものの、既存の .NET Framework 主軸のプロダクトの、サブ的位置づけだったので、メインの DB 操作に EF Core をがっつり組ませることはできないので、テストで利用していた)

最近になり、.NET Framework のプロジェクトを見ており、「なにはなくともテストをバリバリ書ける環境を作るぞ!」ということで同じことを .NET Framework でもやってみました。

EF Core と .NET Framework

Supported .NET implementations - EF Core | Microsoft Docs

上記サイトの通り、.NET Framework であっても 3.1 までなら EF Core を利用できます。

サンプル

GitHub - dany1468/NetFrameworkEfCoreTest

SDK スタイルでプロジェクトを作っておくと、dotnet cli との親和性もいいのでオススメです。(私が Rider 使いなので、VS でこの辺どういう感じかわかりませんが)

SDK スタイル プロジェクトでのターゲット フレームワーク - .NET | Microsoft Docs

PS > dotnet new classlib --target-framework-override net48 -o TestData

後は、EntityFramework と Scaffold 用のライブラリを入れます。上述の通り、3.1 系までなので、3.1.14 が現時点では利用できる一番新しいバージョンです。

PS > dotnet add package Microsoft.EntityFrameworkCore.Design -v 3.1.14
PS > dotnet add package Microsoft.EntityFrameworkCore.SqlServer -v 3.1.14

続いて、いろいろコマンドラインで済ませたいので dotnet tools で dotnet-ef を入れます。もちろん local install で。

PS > dotnet new tool-manifest
PS > dotnet tool install dotnet-ef
PS > dotnet ef --version
Entity Framework Core .NET Command-line Tools
5.0.5

dotnet tools に関しては、私は特に気にせず新しいのを入れてます。あくまでビルドは生成に利用するプロジェクトの Framework version を見るのでツールの方は関係ないようです。

後は対象の DB に対して以下を実行するだけです。(以下は docker で動いている DB に向けている例です。{{}} の中は実際には埋めてください。)

PS > dotnet ef dbcontext scaffold \
  --context MainDbContext \
  --context-dir Data/Entities \
  --output-dir Data/Entities \
  -f "Server=host.docker.internal,14331;Database={{.DATABASE}};User Id={{.USER}};Password={{.PASS}};" \
  Microsoft.EntityFrameworkCore.SqlServer

サンプルプロジェクトではテーブルを個別に指定するようにしていますが、上記のコマンドであれば、全テーブルを一気に作成できます。

EF Core の 5 からは --no-onconfiguring があるので、生成される DbContextOnConfiguring に余計な warning が埋め込まれなくていいんですが、まあこれは仕方ない。