コーヒー飲みながら仕事したい

仕事で使う技術的なことの備忘録とか


Wordpress に引っ越しました!

.NET Standard で EntityFrameworkCore の Scaffold を実行する

移転しました。

前回、 .NET Core で Scaffold しましたが、

tassi-yuzukko.hatenablog.com

クラスライブラリ側に Scaffold して DTO クラスを自動生成したくなりました。

しかし、単純ではなかったので、こちらも備忘録として残しておきます。

はじめに

単純に .NET Standard で Scaffold しようとすると、以下のエラーが出力されます。
(あらかじめ、前回の .Net Core コンソールアプリケーション用の環境を nuget 済みという前提です)

> dotnet ef dbcontext scaffold "Data Source=192.168.XXX.XXX\XXXX;I
nitial Catalog=XXXDb;Persist Security Info=True;User ID=XXX;Password=XXXXXXXXXXX" Microsoft.EntityFrameworkCore.Sql
Server -o Models
#  ↓このエラー
Startup project 'ClassLibrary1.csproj' targets framework '.NETStandard'. There is no runtime associated with this framework, and projects targeting it cannot be executed directly. To use the Entity Framework Core .NET Command-line Tools with this project, add an executable project targeting .NET Core or .NET Framework that references this project, and set it as the startup project using --startup-project; or, update this project to cross-target .NET Core or .NET Framework.

どうやら.NET Standard は Scaffold 対応してないみたいです ><

ということで、対応策を調べてみました。

対応策

StackOverflow にありました。

stackoverflow.com

今回は、一番上の回答で提示されている Workaround 2 - Cross-target a runnable framework で対応します。

ちょっとトリッキーな気がしますが、クラスライブラリを .NET Standard と .Net Core の両方で出力するように設定するということみたいです。

.csproj ファイルは以下のような記載になります。

  <PropertyGroup>
-   <TargetFramework>netstandard2.0</TargetFramework>
+   <TargetFrameworks>netcoreapp2.1;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

これで、前回のやり方を実行すると、 Scaffold が成功しました。

このやり方だったら、このクラスライブラリを .NET Standard の別のクラスライブラリに読み込ませることが可能になります。
(.NET Core => .NET Standard および .NET Standard => .NET Standard の依存は OK なのですが、.NET Standard => .NET Core は不可能なので)