けさらんぱさらん

方向性は定めず、ただ思いつくままに

PostgresqlでDynamicData

Asp.Net DynamicDataは、マスターメンテナンス画面とか
簡単なCRUDするWebアプリケーションを
ほぼノンコーディングで作成することができます。
基本的にはSQLServerでやれば簡単に作れるのですが
DBは、SQLServerだけではないので
Postgresqlで奮闘してみました。


・環境
Visual Web Developer 2008
Postgresql8.4
.NetFramework3.5


・準備
NpgsqlをダウンロードしてGACに登録する。
(Npgsql.dllとMono.Security.dll)
machen.configに以下を追記する。

<DbProviderFactories> <!--このタグは元々存在する-->
<add name="Npgsql Data Provider" invariant="Npgsql" 
description=".Net Framework Data Provider for Postgresql Server" 
type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.8.0, 
Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />
</DbProviderFactories>

ああ〜当たり前ですがDBを作ってテーブルも先に作っておきます。


ここまで準備したらVWDでプロジェクトを作成します。
テンプレートは「動的データエンティティWebアプリケーション」を選択します。
SQLServerであればクラスの追加で「ADO.NET Entity Data Model」を選択するんですが
他のDBではこうはいきません。
edmgen.exeというのを使ってファイルを自動生成します。
コマンドプロンプトに以下を入力します

C:\WINDOWS\Microsoft.NET\Framework\v3.5\edmgen.exe /provider:Npgsql /mode:fullgeneration 
/c:"Port=5432;Encoding=UTF-8;Server=localhost;Database=BookStore;UserId=postgres;Password=postgres" 
/project:BookStore /namespace:"DynamicDataEntitySample002.models" /entitycontainer:"BookStoreEntities"

ポイントは、namespaceのところで
これは、ディレクトリ構造と一致していないとうまく動きません。
ファイルが5つ生成されるのですが、全て同一のディレクトリに入れてください。
(上記の場合は、DynamicDataEntitySample002\modelsにファイルをコピー)
追加した「ssdl」「csdl」「msl」はプロパティのビルドアクションで
「埋め込まれたリソース」に設定します。


次にWeb.configに接続文字列を追加します。

<connectionStrings>
<add name="BookStoreEntities" 
connectionString="metadata=res://*/DDWeb.Models.BookStore.csdl | 
res://*/DDWeb.Models.BookStore.msl | 
res://*/DDWeb.Models.BookStore.ssdl;provider=Npgsql;
provider connection string='Server=localhost;Port=5432;UserID=postgres;Password=postgres;Database=BookStore'" 
providerName="System.Data.EntityClient"/>
</connectionStrings>

name属性は、edmgen.exeのパラメータ「entitycontainer」で指定したものにしてください。


最後にGlobal.asaxのコメントアウトされている以下をコメントインして
typeof()のカッコ内とScaffoldAllTables = をtrueに変更してください。

model.RegisterContext(typeof(Models.BookStoreEntities), new ContextConfiguration() { ScaffoldAllTables = true });


これでビルドエラーになる場合(多分なる)は、
System.Data.Entity.dllとSystem.Runtime.Serialization.dllを参照してください。


実行すればきっとうまく画面が表示されるはず〜
なんか間違ってたらご指摘くださいm(__)m