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

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

EntityFrameworkCore で Scaffold 使ってデータベースファーストする方法
主題の件ですが、ハマった部分もあったので備忘録として残しておきます。先に注意点ですが、 .NET Core コンソールアプリケーションと、 ASP.NET Core では Scaffold の条件が異なる というのが今回ハマったところで...

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

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

はじめに

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

> dotnet ef dbcontext scaffold "Data Source=192.168.XXX.XXX\XXXX;Initial Catalog=XXXDb;Persist Security Info=True;User ID=XXX;Password=XXXXXXXXXXX" Microsoft.EntityFrameworkCore.SqlServer -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 は不可能なので)

コメント

タイトルとURLをコピーしました