EntityFrameworkCore2.0・NpgsqlをつかってMacでPostgreSQLに接続して見ます。
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}");
Console.WriteLine($"Id:{__[1].Id}, Name:{__[1].Name}");
}
}
}
}
下記のように出力されました。
問題なく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の技術日記