主題の件ですが、ハマった部分もあったので備忘録として残しておきます。
先に注意点ですが、 .NET Core コンソールアプリケーションと、 ASP.NET Core では Scaffold の条件が異なる というのが今回ハマったところです。
前提事項
- 恐らく現状(dotnet core 2.1)では、CUI でのみしか Scaffold ができないと思われます。なので、操作は PowerShell で行いました。
- あらかじめ
dotnet ef
が実行できることを前提に話を進めます。 - 今回はデータベースファーストですので、あらかじめデータベース上にテーブル等が定義済みであり、それらのテーブルから DTO クラスを自動生成することを目的とします。
Scaffold の仕方
*.csproj
のあるフォルダ内で、以下のコマンドを実行します。
> 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
コマンドの解説です。
- ダブルクオーテーションで囲んだ中身(
"Data Source~"
のところ)は、データベースの接続先情報になります。
接続先情報は、次の通り取得できます。
VisualStudio 上の「サーバーエクスプローラー」ウィンドウから、「データ接続」の項目を選び、そこに表示される接続先(コンセントみたいなのが右下についているアイコンのやつ)を右クリックして、プロパティを表示します。プロパティの「接続文字列」欄にあるやつです。
よくdbcontext scaffold
というキーワードでググったら、Server=~
の例が多いので、Data Source=~
じゃダメなのかと思ったけど、そうじゃないみたいです。 Microsoft.EntityFrameworkCore.Sql
はとりあえずおまじないです。(接続先が SQLServer の場合に限る)-o Models
で、Models フォルダ内に、データベース上のテーブルの DTO クラスが自動生成されます。
とりあえず Scaffold の方法は上記の通りシンプルなのですが、条件がありますので、それを以下に述べます。
ASP.NET Core の場合
こちらは単純です。というか条件はありません。
.NET Core コンソールアプリケーションおよびクラスライブラリの場合
こちらが問題です。
なぜか ASP.NET Core の場合は何も nuget しなくて良いのに、コンソールアプリケーションやクラスライブラリになると、以下のライブラリを nuget する必要があります。
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Design
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
.csproj
ファイル的には以下の感じです。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>
とりあえず、以上で Scaffold により、データベース上のテーブルに対応する DTO クラスが自動生成できました。
コメント