前幾天在FB上看到 Bruce大分享的好文 - ASP.NET MVC, Entity Framework Code First 與 MySql 的筆記。
讓自己想起之前使用過的 PostgreSQL DB ( Wiki , 官網 ),當時也嘗試使用 Code First 方式來處理 DB Model。
趁這個機會來將操作過程做個記錄。
前言
這次的筆記就從 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.org 的 document。
另外在 Document 可以看到官方也持續更新 ( CodeCLR , EF6 , EF7 ),可以讓人放心跟隨使用。
這回因為需要進行 EF Code First 實做,所以搭配 EntityFramework6.Npgsql 組件。
那麼回到主題...
新建 「EF6ForPostgreSQL」MVC5 專案 ( 或直接下載範例專案 :P )
紀錄
依據上述內容,那就開始進行操作。
安裝 Npsql 與 EntityFramework6.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