あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

.NET Core, Entity Framework CoreでPostgresSQLからデータベースファーストでモデルクラスを自動作成する

この記事では、Entity Framework Core で 既存のPostgresSQL データベースからモデルクラスを自動作成しする方法をご紹介します。その後、LINQ を使用してデータベースの内容を出力するコンソールアプリケーションを作成します。

環境は、Mac (macOS High Sierra 10.13.3) で .NET Core SDK 2.1.4、PostgreSQL 10.3 、Visual Studio Code になります。

まず、PostgreSQL で以下の SQL を実行します。

CREATE DATABASE ConsoleTest;
CREATE TABLE Book (
  Id SERIAL PRIMARY KEY,
  Price int,
  Title text
); 


INSERT INTO Book (Price, Title) values (1000,'おはようございます');
INSERT INTO Book (Price, Title) values (500,'こんにちは');
INSERT INTO Book (Price, Title) values (800,'こんばんは');

これで、PostgreSQL の準備ができましたので、.NET Core でコンソールアプリケーションのプロジェクトを作成します。

$ dotnet new console -o ConsoleTest

これでプロジェクトが作成されたので、プロジェクトのルートディレクトリ(.csprojのあるディレクトリ)に移動後、PostgreSQL に必要なパッケージを Nuget からインストールします。

$ cd ConsoleTest
$ dotnet add package Microsoft.EntityFrameworkCore.Tools.DotNet
$ dotnet add package Microsoft.EntityFrameworkCore.Design
$ dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
$ dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL.Design

さらに、Microsoft.EntityFrameworkCore.Tools.DotNet だけは追加で .csproj に追記が必要なので、以下のように最後に追記します。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.0.1" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.1" />
  </ItemGroup>

  <!--ここを追記-->
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>
</Project>

この設定を以下のコマンドでプロジェクトに反映します。

$ dotnet restore

これでプロジェクトの設定も済んだので、下記コマンドで PostgreSQL のデータベースの内容からモデルクラスを自動生成します。ユーザー名、パスワード、データベース名は適宜読み替えてください。

$ dotnet ef dbcontext scaffold "Server=localhost;Database=consoletest;Username=username;Password=password;" Npgsql.EntityFrameworkCore.PostgreSQL -o Models -f

処理が完了したら Model フォルダが作成されているのが分かります。では、Program.cs を以下のように修正します。

using System;
using System.Data;
using System.Linq;
using ConsoleTest.Models;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new consoletestContext())
            {
                foreach (var book in db.Book)
                {
                    Console.WriteLine(book.Title);
                }
            }
        }
    }
}

では、実行してみましょう。

$ dotnet build
$ dotnet run
おはようございます
こんにちは
こんばんは

うまくデータベースの内容を出力することができました。なお、ビルドや実行時に以下の警告が表示されますが、これはプログラム内部に接続文字列を持っているためです。実際のアプリケーションの場合は、接続文字列を外部ファイルに退避させることが推奨されています。

Models/consoletestContext.cs(15,10): warning CS1030: #warning: 'To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.' [/Users/xxx/Projects/ConsoleTest/ConsoleTest.csproj]

これで、既存の PostgreSQL データベースから .NET Core アプリケーションを作成できることが分かりましたね。

なお、現時点(2018/03/11)では、MySQL ではデータベースからモデルクラスを作成することができません。 method not implemented というエラー(未実装)が表示されてしまいます。プレビュー版も試したので、当分解決しないと思います。

データベースファーストで開発するのであれば、MySQL ではなく PostgreSQL を選択するのがよさそうです。MySQL もコードファースト(ソースからデータベースを作成)はできるのですけどね。