ASP.NET Core+Entity Framework CoreでコードからPostgreSQLにデータベースを作成する方法


はじめに

この記事では、ASP.NET Core な Web アプリケーションの Entity Framework Core のコードから、PostgreSQL にデータベースとテーブルを作成して、実際に Web アプリケーションを動作させてみます。

なお、環境は Mac (macOS High Sierra 10.13.3) で .NET Core SDK 2.1.4、PostgreSQL 10.3 、Visual Studio Code になります。とはいえ、Windows でも同じように作成できると思います。

新規プロジェクトの作成と準備

まずは ASP.NET MVC Core の新規プロジェクトを以下のコマンドで作成します。ここで、プロジェクト名は MyProj としていますので、適宜読み替えてください。

$ dotnet new mvc -o MyProj

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

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

現時点では、これだけでは設定が足りないので Microsoft.EntityFrameworkCore.Tools.DotNet の設定を MyProj.csproj に追加します。

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

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

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.0.1" />
 </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.2" />
  </ItemGroup>

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

下記コマンドで設定を反映します。

$ dotnet restore

PostgreSQL へ接続するための設定

PostgreSQL に接続しデータベースとテーブルを作成するために、以下の設定を行います。

・Models/Book.cs の作成

using System;
namespace MyProj.Models
{
    public class Book
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public int Price { get; set; }
    }
}

・Models/MyContext.cs の作成

using System;
using Microsoft.EntityFrameworkCore;

namespace MyProj.Models
{
    public class MyContext : DbContext
    {
        public MyContext(DbContextOptions options) : base(options)
        {

        }
        public DbSet<Book> Book { get; set; }
    }
}

・appsettings.json の設定

以下の設定を追加します。

  "ConnectionStrings": {
    "MyContext": "Server=localhost;Database=myproj;Username=username;Password=password;"
  }

・Startup.cs の設定

以下の using を追加します。

using Microsoft.EntityFrameworkCore;
using Npgsql.EntityFrameworkCore.PostgreSQL;
using MyProj.Models;

ConfigureServices に設定を追加します。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

             // コンテキストクラスを登録
            services.AddDbContext<MyContext>(options => options.UseNpgsql(
                Configuration.GetConnectionString("MyContext")
            ));
        }

PostgreSQL データベースの作成

プロジェクトのルートディレクトリで、以下のコマンドを実行します。MyProj は重複しなければどんな名前でもよいようです。

$ dotnet ef migrations add MyProj
$ dotnet ef database update

すると、以下のようにデータベースとテーブルが正しく追加されていることが分かります。

f:id:fnyablog:20180912144848j:plain

Web アプリにデータベースの内容を表示する

まず、Book テーブルにデータを追加します。

f:id:fnyablog:20180912144936j:plain

それから、ビューにデータを表示するための設定を行います。

・Controllers/HelloController.cs を作成

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MyProj.Models;


namespace MyProj.Controllers
{
    public class HelloController : Controller
    {
        private readonly MyContext _context;

        public HelloController(MyContext context){
            this._context = context;
        }

        public IActionResult List() {
            return View(this._context.Book);
        }
    }
}

・Views/Hello/List.cshtml を作成

@model IEnumerable<MyProj.Models.Book>

@{
    ViewData["Title"] = "List";
}

<h2>List</h2>

<table>
    <tr>
        <td>書名</td>
        <td>価格</td>
    </tr>
    @foreach(var item in Model) {
        <tr>
            <td>@item.Title</td>
            <td>@item.Price</td>
        </tr>
    }
</table>

では、下記コマンドで Web アプリケーションを起動します。

$ dotnet run

ブラウザでアクセスすると、問題なく表示されますね。

f:id:fnyablog:20180912145144j:plain

おわりに

MySQL で同じことを行ったのですが、PostgreSQL でも問題なく動作することが分かりました。

コードファーストでは MySQL も PostgreSQL も問題ないようですね。

参考書籍