きときと

日々のあれこれ ソフトウェアエンジニア

Visual Studio for Mac・EntityFrameworkCore2.0でPostgreSQLに接続する

EntityFrameworkCore2.0・NpgsqlをつかってMacPostgreSQLに接続して見ます。
Npgsqlの公式に説明があるので、そのように進めていきます。
Getting Started | Npgsql Documentation

環境

今回サンプルを作成した環境です。

dotnet --info
.NET コマンド ライン ツール (2.0.0)

Product Information:
 Version:            2.0.0
 Commit SHA-1 hash:  cdcd1928c9

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.12
 OS Platform: Darwin
 RID:         osx.10.12-x64

データベース準備

まず接続先のデータベースを用意します。 DockerでPostgreSQL9.6の環境を構築しました。 下記を参考にさせていただきました。

Docker公式イメージで開発用RDBをゲットだぜ(PostgreSQL編) « LANCARD.LAB|ランカードコムのスタッフブログ

データベースへ接続できたら、適当にデータベース・テーブルとテスト用データを作成しておきます。

CREATE DATABASE netcore_ef;

CREATE TABLE members
(
    id serial PRIMARY KEY,
    name character varying(32) NOT NULL
);

INSERT INTO members(name) VALUES('test1');
INSERT INTO members(name) VALUES('test2');

パッケージインストール

VisualStudioを開き、コンソールアプリケーションを作成。
NuGetでパッケージインストールします。

  • Npgsql.EntityFrameworkCore.PostgreSQL:2.0.0
  • Microsoft.Extensions.Configuration.Json:2.0.0
    Database設定情報をJson形式の設定ファイルから取得する際に必要になります。

DbContext作成

データベースへアクセスするためのDbContextを作成します。
データベースの情報は設定ファイルから読み込むようにします。
先ほど構築したデータベースが接続先となるように、設定ファイルappsettings.jsonを作成します。

■appsettings.json

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=HOST;port=PORT;Username=USERNAME;Password=PASSWORD;Database=DBNAME"
  }
}

■DbContext

using Database.NpgsqlEF.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace Database.NpgsqlEF
{
    public class DatabaseContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            optionsBuilder.UseNpgsql(config.GetConnectionString("DefaultConnection"));
        }

        public DbSet<Member> Members { get; set; }
    }
}

OnConfiguring()メソッド中で、ConfigurationBuilderに先ほど作成したappsettings.jsonの設定をバインドしています。
データプロバイダにNpgsqlを使用する場合、optionsBuilder.UseNpgsql(接続情報)のように設定します。

Entity作成

EntityFrameworkCoreで扱うEntityクラスを作成します。
先ほどデータベースに作成した、membersテーブルに対応するクラスを作成します。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Database.NpgsqlEF.Entities
{
    [Table("members")]
    public class Member
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }

        [Column("name")]
        public string Name { get; set; }
    }
}

DataAnnotationsについて、Table, Column属性 はそのままの通り、データをマッピングテーブル名・カラム名を設定します。
Key属性はプライマリーキーを設定します。 www.entityframeworktutorial.net

実行

それでは実行して見ます。
単純にSelectしてコンソールにデータを出力します。

using System;
using System.Linq;
using Database.NpgsqlEF;

namespace Netcore_EF_Npgsql
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var context = new DatabaseContext())
            {
                var __ = context.Members.ToList();
                Console.WriteLine($"Id:{__[0].Id}, Name:{__[0].Name}"); // Id:1, Name:test1
                Console.WriteLine($"Id:{__[1].Id}, Name:{__[1].Name}"); // Id:2, Name:test2
            }
        }
    }
}

下記のように出力されました。
問題なくSelectできています。

Id:1, Name:test1
Id:2, Name:test2

まとめ

非常に簡単に実践できました。
. NET Framework、EntityFramework6.Npgsql よりも、依存関係によるエラーなどもなくお手軽に試すことができる気がします。
次はコードファーストによるマイグレーションを試してみようと思います。

サンプルプロジェクト

今回作成したサンプルをGitHubにアップしています。
github.com

参考

NpgsqlとEntityFramework Coreを使ってPostgreSQLをCRUDする - け日記
.NET Core(Entity Framework Core)でCode Firstする - ryuichi111stdの技術日記