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

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


Wordpress に引っ越しました!

EntityFrameworkCore で Scaffold 使ってデータベースファーストする方法

移転しました。

主題の件ですが、ハマった部分もあったので備忘録として残しておきます。

先に注意点ですが、 .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;I
nitial Catalog=XXXDb;Persist Security Info=True;User ID=XXX;Password=XXXXXXXXXXX" Microsoft.EntityFrameworkCore.Sql
Server -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 する必要があります。

.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 クラスが自動生成できました。