Study & Practice

北海道札幌市のプログラマによる技術とか雑記のブログ

ASP.NET Core MVCにPostgreSQLを導入する

本記事はASP.NET Core は3.1、PostgreSQLは12.0で行っています
ASP.NET CoreでPostgreSQLを使えるようにするまでなのでPostgreSQLのインストールなどは割愛してあります。

こちらのチュートリアルをベースに進めていきます
docs.microsoft.com

ASP.NET Core 3.0に更新してないと書いてあるのでこちらの内容も織り交ぜてあります。
docs.microsoft.com

プロジェクトの作成

まずはVisual Stadioで新しいプロジェクトの作成→ASP.NET Core Webアプリケーションと選択します。
プロジェクト名はPostgreSQLTrialとしました。

フレームワークが「.NET Core」バージョンが「ASP.NET Core 3.1」になっていることを確認し、Webアプリケーション(モデルビューコントローラー)を選択します。

作成ボタンを押せばプロジェクトが作成されます。

パーケージのインストール

Entity Framework CoreとEntity Framework CoreでPostgreSQLを扱うためのパッケージをインストールします。
パッケージマネージャーコンソールで下記のコマンドを実行

Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Npgsql.EntityFrameworkCore.PostgreSQL

正常にインストールされれば完了です。

コードの追加

モデルの作成を作成します。
プロジェクト直下のModels配下に以下の内容でStudent.csを追加

namespace PostgreSQLTrial.Models
{
    public class Student
    {
        public int Id { get; set; }
        public string FirstMidName { get; set; }
        public string LastName { get; set; }
    }
}

次にContextを作成します。
プロジェクト直下にDataディレクトリを作成し、Dataディレクトリ配下に以下の内容でShoolContext.csを追加します。

using Microsoft.EntityFrameworkCore;
using PostgreSQLTrial.Models;

namespace PostgreSQLTrial.Data
{
    public class SchoolContext: DbContext
    {
        public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
        {

        }

        public DbSet<Student> Students { get; set; }
    }
}

ConnectionStringの設定

次はPostgreSQL接続用のConnectionStringを設定します。ConnectionStringはappsettings.jsonとappsettings.Development.jsonで定義します。appsettings.jsonは本番構成時、appsettings.Development.jsonデバッグ構成時に利用されます。

それぞれに以下を追加します。

"ConnectionStrings": {
    "SchoolContext": "Host=my_host;Database=my_db;Username=my_user;Password=my_pw"
}

追加後のappsettings.jsonは私の環境では以下のようになっています。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
    "ConnectionStrings": {
        "SchoolContext": "Host=my_host;Database=my_db;Username=my_user;Password=my_pw"
    }
}

my_host、my_db、my_user、my_pwとなっている箇所は自分のPostgreSQLの設定に合わせて適宜変更が必要です。

次にStartup.csにSchoolContextを追加する処理を加えます
以下のコードをConfigureServicesに追加してください。

services.AddDbContext<SchoolContext>(options => 
{
    options.UseNpgsql(Configuration.GetConnectionString("SchoolContext"));
});

追加後のConfigureServicesは以下のようになります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddDbContext<SchoolContext>(options => 
    {
        options.UseNpgsql(Configuration.GetConnectionString("SchoolContext"));
    });
}

Migrationの作成と実行

まずはPostgreSQLにSchoolデータベースを作成します。

PostgreSQLで以下のSQLを流します

create database school;

データベースの作成もコードファーストで行いたい方は
docs.microsoft.com
こちらを参考にしてください。

データベースの作成が完了したら以下のコマンドをパッケージマネージャーコンソールで流します。
このコマンドで移行の作成とデータベースへの適用が完了します。

Add-Migration InitialMigration
Update-Database

スキャフォールディングでControllerとViewを追加する

ソリューションエクスプローラーでControllersディレクトリを右クリック→追加→新規スキャフォールディングアイテムと選択します。

「新規スキャフォールディングアイテムの追加」ダイアログでは「Entity Framework を使用したビューがあるMVCコントローラー」を選択し、「追加」を押します。

モデルクラスに「Student」、データコンテキストクラスに「SchoolContext」を選択します。

コントローラー名は任意でいいですが本記事ではデフォルトの「StudentsController」としました。

「追加」を押します。

スキャフォールディングが完了するとControllers配下に「StudentsController.cs」がViews配下に「Students」ディレクトリがあり、Index、Create,Edit、Details、Deleteのcshtmlファイルがあるはずです。

動作確認

F5を押す、もしくはIIS Expressボタンを押してデバッグ実行します。

ブラウザが立ち上がったらアドレスバーに「/Students/Index」を追加します。

追加後のアドレスは私の環境では「https://localhost:44345/Students/Index」となりました。

Studentの一覧画面が表示されていると思いますので追加、編集、削除を実行します。

それぞれ正常に動作すればASP.NET Core MVCへのPostgreSQL導入は完了です