.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
があるので、生成される DbContext
の OnConfiguring
に余計な warning が埋め込まれなくていいんですが、まあこれは仕方ない。