2017年7月18日 星期二

C#.NET 使用Entity Framework讀取pgSQL(PostgreSQL)


昨天剛換了新工作
剛上任就碰到了些問題

新公司這邊使用.NET MVC5,可是資料庫使用PostgreSQL(後面稱pgSQL)
.NET預設無法對pgSQL做操作,所以這案子前面寫的人使用JAVA的模式,把SQL指令存在XML,然後再對SQL操作

可是怎麼辦,我已經變成不使用EF會死星人了!!
只好來研究一下怎麼處理



首先我看到了這篇

Entity Framework Code First For PostgreSQL

我參照他的,步驟
直接在NuGet上面安裝了 Npgsql以及EntityFramework6.Npgsql

可是MS SQL有一個方便的功能,可以直接抓資料表產生edmx,pgSQL沒辦法
於是我又去找了一下
我找到了一個要付費的套件

dotConnect for PostgreSQL

如果你公司肯付錢就直接使用這個套件吧

我知道一般都不會用付費套件,所以我們繼續往下看

我們先建立SQL的連結字串

    <connectionstrings>
        <add name="SampleContext" connectionstring="Server=localhost;Port=5432;Database=SampleDB;User Id=postgres;Password=123456;" providername="Npgsql"></add>
    </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>

接下來我們就可以開始我們的正戲了

我們先建立一個連結資料庫的DbContext


using System.Data.Entity;
namespace DAL.models
{
    public class SampleDbContext : DbContext
    {
        public SampleDbContext()
            : base("name=SampleContext")
        {
        }
        public virtual DbSet<userinfo> UserInfo { get; set; }
    }
}

由於沒有工具幫我們產生MODEL,所以我們得自己寫MODEL



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

namespace DAL.models
{

    public class UserInfo
    {
        public int id { get; set; }//流水號
        public string user_id { get; set; }//使用者帳號 
        public string user_name { get; set; }//使用者名稱

    }
}


然後我們就可以使用他了嗎?
不,他會發生這樣的事情

慘,MS SQL 預設是dbo,pgSQL不是餒
怎麼辦?

我們再找找

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

namespace DAL.models
{
    [Table("user_info", Schema = "public")]
    public class UserInfo
    {
        [Key]
        [Column("id_customer")]
        public int id { get; set; }//流水號
        public string user_id { get; set; }//使用者帳號 
        public string user_name { get; set; }//使用者名稱

    }
}

我們加上了Table名稱以及Schema,這樣就可以讀取了
當然,欄位名稱也可以有所不同


public ActionResult GetUserInfoList()
{
    List result;
    using (var _db = new SampleDbContext())
    {
        var tmp_data = _db.UserInfo;
        result = tmp_data.ToList();
    }
    return Json(result, JsonRequestBehavior.AllowGet);
}

此時我們就可以使用EF抓取資料了

理論上,後面這些code,也可以用在別的資料庫上
可以參考

當然還有Create、Update、Delete
不過新工作我暫時用不上,就留給各位研究了

沒有留言:

張貼留言