Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

PostgreSQLでASP.NET Dynamic Dataサイトを構築する

PostgreSQLでASP.NET Dynamic Dataサイトを構築するためにやったこと【ご注意:失敗に終わりました】 - プログラマーな日々
PostgreSQLでASP.NET Dynamic Dataサイトを構築することを試みましたが、失敗に終わりました。誰かの役にたつかもしれないので、試行錯誤の記録を残しておきます。 ...

以前一度は失敗していますが、後日ASP.NET Dynamic Dataサイトの構築に成功したので、手順を残しておきます。

検証した環境

  • WindowsXP SP3
  • .NET Framework 3.5
  • Visual Studio 2008 SP1
  • PostgreSQL 8.3
  • Npgsql 2.0.11.91

テーブルの作成

まず、テーブルを作成しました。

CREATE TABLE hoge_table (
  hoge_id smallint NOT NULL,
  hoge_name character varying(255),
  CONSTRAINT hoge_table_pkey PRIMARY KEY (hoge_id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE hoge_table OWNER TO postgres;

Npgsqlのインストール

Npgsqlをインストールします。

ダウンロード

pgFoundry: Npgsql .Net Data Provider for Postgresql: Project Filelist

  • リンク先から最新バージョンのNpgsqlをダウンロードします。(2011/07/22時点では「Npgsql2.0.11.91-bin-ms.net3.5sp1.zip」)
  • 解凍して適当なディレクトリに配置します。
GAC(グローバルアセンブリキャッシュ)への登録
  • Visual Studio 2008 コマンドプロンプトを起動します。
  • Npgsql.dllのあるディレクトリへ移動します。
  • 以下のコマンドを実行します。
gacutil /i Npgsql.dll
gacutil /i Mono.Security.dll
  • C:\Windows\assemblyに上記のdllが登録されていることを確認します。
machine.configへの登録

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.configにNpgsqlを登録します。

<configuration>  
  <!-- 省略 -->  
  </system.data>  
    <DbProviderFactories>  
      <!-- 省略 -->  
      <!-- Versionは、GACに登録したNpgsql.dllのバージョンに合わせること -->  
      <add
        name="Npgsql Data Provider"
        invariant="Npgsql"
        description=".Net Framework Data Provider for Postgresql Server"
        type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.11.91, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />  
    </DbProviderFactories>  
  </system.data>  
  <!-- 省略 -->  
</configuration>
Npgsqlインストールの確認

コンソールアプリを作成し、以下のステートメントを実行します。例外が発生しなければ正常に登録できています。

System.Data.Common.DbProviderFactory f = System.Data.Common.DbProviderFactories.GetFactory("Npgsql");

Entity Framework(以下EF)のソースコードを生成

NpgsqlはVisual Studioのウィザードに対応していないので、コマンドラインで生成します。

  • Visual Studio 2008 コマンドプロンプトを起動します。
  • 適当なディレクトリへ移動します。
  • 以下のコマンドを実行します。/projectに設定する名前は任意ですが、ここでは「sample」としておきます。以降は「Sample」という名前を指定したという前提で説明を進めます。
edmgen.exe /provider:Npgsql /mode:fullgeneration /c:"Port=5432;Encoding=UTF-8;Server=XXX;Database=XXX;UserId=XXX;Password=XXX" /project:Sample

以下のメッセージが表示されれば、正常にソースコードが生成できています。

Microsoft (R) EdmGen version 3.5.0.0
Copyright (C) 2008 Microsoft Corporation. All rights reserved.

データベースの情報を読み込んでいます...
ssdl ファイルを書き込んでいます...
格納層から概念層を作成しています...
msl ファイルを書き込んでいます...
csdl ファイルを書き込んでいます...
オブジェクト層ファイルを書き込んでいます...
ビュー ファイルを書き込んでいます...

生成完了 -- エラー 0 件、警告 0 件

以下の5ファイルがカレントディレクトリに生成されているはずです。

  • Sample.csdl
  • Sample.msl
  • Sample.ObjectLayer.cs
  • Sample.ssdl
  • Sample.Views.cs

Dynamic Data エンティティ Web サイトの構築

Webサイトの構築
  • Visual Studioを起動し、メニューの[ファイル] - [新規作成] - [Webサイト]を選択します。
  • [Dynamic Data エンティティ Web サイト]を選択します。
App_Codeフォルダの作成


生成したソースファイルの追加

先ほど生成した以下のソースファイルをApp_Codeフォルダに追加します。

  • Sample.csdl
  • Sample.msl
  • Sample.ObjectLayer.cs
  • Sample.ssdl
  • Sample.Views.cs
接続文字列の設定

Web.configにEFの接続文字列を設定します。

<configuration>
  <!-- 省略 -->
  <connectionStrings>
    <add
        name="SampleContext"
        connectionString="metadata=~/App_Code/Sample.csdl|~/App_Code/Sample.msl|~/App_Code/Sample.ssdl;provider=Npgsql;provider connection string=&quot;Server=XXX;Port=5432;UserID=XXX;Password=XXX;Database=XXX&quot;"
        providerName="System.Data.EntityClient"/>
  </connectionStrings>
  <!-- 省略 -->
</configuration>
Global.asaxの編集
  • Global.asaxの17行目のコメントを外します。
  • Contextのクラス名とScaffoldAllTablesプロパティを以下のように書き換えます。
model.RegisterContext(typeof(Sample.SampleContext), new ContextConfiguration() { ScaffoldAllTables = true });
参照設定(2011/08/15追記)

System.Data.Entityへの参照を追加します。

ASP.NETのバージョン設定(2011/08/15追記)

インターネットインフォーメーションサービスを起動し、Webサイトのプロパティを表示します。[ASP.NET]のタブをクリックし、[ASP.NETバージョン]を正しく設定します。(動作環境が.NET Framework 3.5の場合はASP.NET 2.0を選択します)

Webサイトの動作確認

スタートページの設定

Default.aspxをスタートページに設定します。

[Ctrl] + [F5]を押します。

以下のページが表示されれば、構築成功です。

カスタマイズ

カスタマイズについては以下を参考にしてください。
DBアプリをコーディングレスで構築する「ASP.NET Dynamic Data」 − @IT
メタデータ編集によるDynamic Dataアプリケーションのカスタマイズ

参考にしたページ

[C#][EntityFramework]PostgreSQLでEntityFrameworkしてみた
ここ最近調べてたことだけど、やっと出来た!! ということでVisual Studioを使ってみた感じだとSQL Serverにしか対応してないように見えるEntityFrameworkを、PostgreSQLで使うメモです。 ...

DBアプリをコーディングレスで構築する「ASP.NET Dynamic Data」 − @IT
そして、第1弾となる今回は、まずASP.NET Dynamic Data(以降、Dynamic Data)について解説する。このDynamic Dataは、リレーショナル・データベースをモデリングしたモデル・クラス(データ・モデル)を基に、CRUD(Create/Read/Update/Delete)機能を持ったアプリケーションを自動生成する機能だ。 ...

ASP.NET Dynamic Data活用編:CodeZine(コードジン)

PostgreSQLでASP.NET Dynamic Dataサイトを構築したい
PostgreSQLでASP.NET Dynamic Dataサイトを構築する方法、もしくはそれに代替できる方法を調査しています。 ...

LINQ to SQLでPostgreSQLのASP.NET Dynamic Dataサイトを構築したい
LINQ to SQLでPostgreSQLのASP.NET Dynamic Dataサイトを構築する方法を模索しています。 ...

(2011/08/15追記)