いつもはSQLServer使ってたんだけど、たまにはPostgreSQLも使ってみようかと思いまして、やってみた。
MVCはVisualStudioでテキトーにテンプレを使う。メンドーなので認証なし。そしたらNugetで下の3つのパッケージをインストール。
EFはEFのために必要。EFでPostgre使うためにNpgsql.EntityFrameworkが必要。これのためにNpgsqlが必要。みたいな感じらしい。EFは6。
そしたら次はWeb.configの設定
<!--ここはインストールすると勝手に入る-->
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<!--ここを手で追記-->
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
<!--接続文字列の指定-->
<connectionStrings>
<add name="DefaultConnectionPGSQL" connectionString="Server=localhost;Port=5432;User Id=postgres;Password=*****;Database=hogedb" providerName="Npgsql" />
</connectionStrings>
手で追記する部分があるっぽい。ここ入れないと動かなかった。あとは接続文字列の指定。
ためしに作ったテーブルは下の二つ。日本語列名がいけるか試したいので日本語で。
--主キーがserial(SQLServerで言うIdentity)じゃないやつ create table dbo.ホゲテーブル ( ホゲ varchar(100) ,数値 int ,CONSTRAINT wkpk PRIMARY KEY (ホゲ) ) --主キーにserial(SQLServerで言うIdentity) create table dbo.フガテーブル ( フガid SERIAL ,テスト varchar(100) ,数値 int )
で、ワナが一つ。SQLServerはデフォでスキーマ名が「dbo」になる。なので、EFも何もしないとSQLに「dbo.table」みたいに書かれる。なので、Postgreのスキーマはdboで作っておいた方が吉。スキーマを変える場合は後述。
あとは、ためし実装。Model側。
public class HomeModels : DbContext
{
public HomeModels() : base("DefaultConnectionPGSQL")
{
}
public DbSet<HogeTable> HogeTables { get; set; }
public DbSet<FugaTable> FugaTables { get; set; }
public HomeViewModel getTable()
{
HomeViewModel resultModel = new HomeViewModel();
resultModel.hogeT = this.HogeTables.Where(n => n.hogeval > 0).ToList();
resultModel.fugaT = this.FugaTables.Where(n => n.数値 > 0).ToList();
return resultModel;
}
public void modelAdd()
{
HogeTable addM = new HogeTable();
addM.hogekey = DateTime.Now.ToString("yyyyMMddhhmmssfff");
addM.hogeval = 123;
this.HogeTables.Add(addM);
FugaTable addM2 = new FugaTable();
addM2.テスト = DateTime.Now.ToString("yyyyMMddhhmmssfff");
addM2.数値 = 123;
this.FugaTables.Add(addM2);
this.SaveChanges();
}
}
public class HomeViewModel
{
public List<HogeTable> hogeT { get; set; }
public List<FugaTable> fugaT { get; set; }
}
[Table("ホゲテーブル")] //テーブル名指定
public class HogeTable
{
[Key] //主キーの設定
[Column("ホゲ")] //列名指定
public string hogekey { get; set; }
[Column("数値")]//列名指定
public int hogeval { get; set; }
}
[Table("フガテーブル", Schema = "dbo")] //スキーマ変えたいとき
public class FugaTable
{
[Key] //主キーの設定
public int フガid { get; set; }
public string テスト { get; set; }
public int 数値 { get; set; }
}
コントローラ側。HomeのIndexだけで、あと、データ追加用のAction。
HomeModels db = new HomeModels();
public ActionResult Index()
{
HomeViewModel result = db.getTable();
return View(result);
}
public ActionResult AddAction()
{
db.modelAdd();
return RedirectToAction("Index");
}
View側はこれ。
@model mvcdemo.Models.HomeViewModel
@{
ViewBag.Title = "Home Page";
}
<div>
@Html.ActionLink("Add","AddAction")
</div>
<h1>ホゲテーブル</h1>
<div>
@foreach(var tmp in Model.hogeT)
{
<table>
<tr>
<td>
@tmp.hogekey
</td>
<td>
@tmp.hogeval
</td>
</tr>
</table>
}
</div>
<h1>フガテーブル</h1>
<div>
<table>
@foreach (var tmp in Model.fugaT)
{
<tr>
<td>
@tmp.フガid
</td>
<td>
@tmp.テスト
</td>
</tr>
}
</table>
</div>
実行結果で、何回か追加した後。

ちゃんとIDも振られてるし問題なし。。。フツーに使える。よかたよかた。
スキーマ変えたいときはテーブルのModel作るときに属性で「[Table("フガテーブル", Schema = "dbo")] 」って感じにする。全体通してやる場合はDbContextのクラスの中に下を入れておく。
public class HomeModels : DbContext
{
public HomeModels() : base("DefaultConnectionSQLServer")//DefaultConnectionPGSQL
{
}
//これを入れる
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("dbo");
}
public DbSet<HogeTable> HogeTables { get; set; }
public DbSet<FugaTable> FugaTables { get; set; }
・・・
Modelのインスタンス作った時に呼ばれるやつではないかと。。。
ちなみにこの状態のまま、SQLServer側に同じテーブル作って、接続文字列の指定でSQLServer用のものを書けばそのままDB切り替えられました。ためしに色々やるのに便利。。。
Postgerはフツーに使えていい感じなんだけど、なんつーか、Postgreの管理ツールがびみょー。なんかいいの無いのかしら。
pgAdminなるものを使用してみたけど。微妙じゃない?なんつーか自分がMicrosoftに染められてるんだろーけど、インテリセンス弱すぎじゃない?あと、エラーとか警告とか結果の出力とかもろもろもろもろもろ。SQLServerのManegementStudioはやっぱりさすがにさすがにって感じなんだろーか。。。
