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}"); // 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の技術日記