Entity Framework Code First For PostgreSQL

前幾天在FB上看到 Bruce大分享的好文 - ASP.NET MVC, Entity Framework Code First 與 MySql 的筆記

讓自己想起之前使用過的 PostgreSQL DB ( Wiki , 官網 ),當時也嘗試使用 Code First 方式來處理 DB Model。

趁這個機會來將操作過程做個記錄。

前言

Postgresql elephant.svg

這次的筆記就從 PostgreSQL 9.5 版本 on Windows 的下載與安裝開始。官網下載點

在 Windows 環境的安裝步驟超簡單,一直 "下一步" 就好...(之後再補個記錄文)

.NET Data Provider For PostgreSQL

由於我們需求是串接到 PostgreSQL,所以需要有 For PostgreSQL 的 .NET 的 Data Provider。

這裡選的是 Npgsql 組件。( 100% C# Cdoe )

想要深入研究的人,可再查閱 Npgsql 的 SourceCode on GitHub,或瀏覽 Npgsql.orgdocument

另外在 Document 可以看到官方也持續更新 ( CodeCLR , EF6 , EF7 ),可以讓人放心跟隨使用。

這回因為需要進行 EF Code First 實做,所以搭配 EntityFramework6.Npgsql 組件。

那麼回到主題...

新建 「EF6ForPostgreSQL」MVC5 專案 ( 或直接下載範例專案 :P )

範例專案:GitHub

紀錄

依據上述內容,那就開始進行操作。

安裝 NpsqlEntityFramework6.Npgsql

Install-Package Npgsql
Install-Package EntityFramework6.Npgsql

或者如下圖操作:

安裝完成後,會在 Web.config 的 entityFramework 下,多一組 provider 設定。(如下)

<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />

再來加上 ConnectionString,相關 PostgreSQL 連線設定可參閱 這裡

<connectionStrings>
    <add name="SampleDbContext" connectionString="Server=localhost;Port=5432;Database=SampleDB;User Id=postgres;Password=123456;" providerName="Npgsql" />
</connectionStrings>

並加上 System.Data 的 DbProviderFactories 設定:

<system.data>
    <DbProviderFactories>
        <remove invariant="Npgsql" />
        <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
</system.data>

建立 SampleDbContext 與 Categories DB Model

using System.Data.Entity;

namespace EF6ForPostgreSQL.Models
{
    public class SampleDbContext : DbContext
    {
        public SampleDbContext()
            : base("name=SampleDbContext")
        {
        }

        public virtual DbSet<Category> Categories { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace EF6ForPostgreSQL.Models
{
    public class Category
    {
        public Category()
        {
            this.Category1 = new HashSet<Category>();
        }

        [Key]
        public Guid Id { get; set; }

        [ForeignKey("Category2")]
        public Guid? ParentId { get; set; }

        public string Name { get; set; }

        public virtual ICollection<Category> Category1 { get; set; }

        public virtual Category Category2 { get; set; }
    }
}

接下來開始進行 Code First 動作囉 ! 開啟 套件管理器主控台

Enable-Migrations

新增 Migration 後,成功產出 Migration Class,如下圖:

Add-Migration "Init"

接著就可以直接更新 PostgreSQL 資料庫囉,成功產出 SampleDB,如下圖:

Update-Database -Verbose

產出的 Categories Table,也成功地呈現我們的設定:

回到 HomeController,新增 GetCategories Action,透過 SampleDbContext 取得 Categories 資料。

using EF6ForPostgreSQL.Models;
using System.Web.Mvc;

namespace EF6ForPostgreSQL.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetCategories()
        {
            SampleDbContext dbContext = new SampleDbContext();

            var result = dbContext.Categories;

            return Json(result, JsonRequestBehavior.AllowGet);
        }
    }
}

以上,就是簡易的操作 EF Code First For PostgreSQL 紀錄。

資源

●  PostgreSQL Wiki
●  PostgreSQL.org
●  Npgsql.org
●  NuGet Npgsql
●  NuGet EntityFramewok6.Npgsql
●  Npgsql GitHub