.NET でもスキャフォールディングで楽したい

ADO.NET Dynamic Data と ADO.NET Entity Framework

ADO.NET Entity Framework は データベースのスキーマと Entity Data Model みたいなオブジェクトのモデルをマッピングするフレームワークです。
O/R マッパとどう違うのかと言われると実はよく分かっていなかったり。

ADO.NET Dynamic Data は、この Entity Framework で生成されたたデータアクセスのコードに加えて、その View まで自動生成しちゃおうという、スキャフォールディングの機能というわけです。Ruby on Rails とかではおなじみの機能みたいですね。

でも、困った事に MS 得意の GUI での簡単操作ができるのは SQL ServerOracle ぐらいしか無い。僕は業務では PostgreSQL なので困ったわけですが、コマンドラインでやる方法も提供されているので、そちらで行います。

おおまかな手順

  1. Npgsql を GAC に登録する
  2. machine.config に Npgsql のプロバイダ登録を行う
  3. edmgen.exe で Entity Data Model を自動生成する
  4. ADO.NET Dynamic Data サイトの作成

ではやっていきます。

1. Npgsql を GAC に登録する

gacutil を使う方法と C:\WINDOWS\assembly に直接ドラッグドロップしてしまう方法がありますが、どちらでも。

対象は Npgsql のアセンブリである以下です。

  • Npgsql.dll
  • Mono.Security.dll

注意点として、Entity Data Model が .NET Framework 3.5 以降なので 3.5 用以上のものを選択してください。今回はNpgsqlの公式サイトより「Npgsql2.0.11-bin-ms.net3.5sp1.zip」を選びました。

2. machine.config に Npgsql のプロバイダ登録を行う

machine.config ですが、今回は .NET Framework 3.5 を対象にするので 2.0 系のものに登録します。

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config

追加するのは以下です。すでに DbProviderFacrtories セクションが存在する場合は単純に Npgsql の分だけ追加でOKです。

<system.data>
  <DbProviderFactories>
    <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.11.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7, processorArchitecture=MSIL" />]
  </DbProviderFactories>
</system.data>

さて、これで自動生成のための準備は整いました。
※もちろん自動生成対象のDBスキーマは存在するという前提ですよ。

3. edmgen.exe で Entity Data Model を自動生成する

C:\WINDOWS\Microsoft.NET\Framework\v3.5\edmgen.exe /provider:Npgsql /mode:fullgeneration /c:"Port=5432;Encoding=UTF-8;Server=***.***.***.***;Database=***;UserId=***;Password=***" /project:TestWeb /namespace:"TestWebDataService.Models" /entitycontainer:"TestWebEntities"

project は生成されるファイル群の名前になります。
namespace は生成されるコードの直接呼び出す部分のコードの名前空間になります。
entitycontainer は上記コードのクラス名及び、EntityClient とのコネクションの名前にもなります。

正常に進めば以下のようなメッセージがでます。

〜警告メッセージ〜

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

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

失敗する場合は大抵の場合は DB との接続情報の誤りか、1,2 の手順にミスがある事が多いです。
成功した場合は以下のファイルが実行した場所に生成されます。

  • TestWeb.csdl
  • TestWeb.msi
  • TestWeb.ObjectLayer.cs
  • TestWeb.ssdl
  • TestWeb.Views.cs

ADO.NET Dynamic Data サイトの作成

さて、実際に使ってみます。
今回は Visual Web Developer 2008 を使いました。
「新しいプロジェクト -> 動的データエンティティ Web アプリケーション」
を選択します。

※確認はしていませんが、この時自動生成時の namespace とフォルダ構成を同じにする必要があるかもしれません。

フォルダ構成
TestWebDataService
 + Default.aspx
 + web.config
 + Models
   + TestWeb.csdl 
   + TestWeb.msi
   + TestWeb.ObjectLayer.cs
   + TestWeb.ssdl
   + TestWeb.Views.cs

TestWeb.csdl, msi, ssdl の3ファイルはプロパティからビルドアクションを「埋め込まれたリソース」に変更しておきます。

web.config にEntity Connection 情報を追加

ここの記述は間違いやすいですが、Edmgen.exe に使用したもののうち、「namespace.project.csdl or msl or ssdl」となるということを押さえておけば大丈夫です。

<connectionStrings>
  <add name="TestWebEntities" connectionString="metadata=res://*/TestWebDataService.Models.TestWeb.csdl|res://*/TestWebDataService.Models.TestWeb.msl|res://*/TestWebDataService.Models.TestWeb.ssdl;provider=Npgsql;provider connection string='Port=5432;Encoding=UTF-8;Server=***;Database=***;UserId=***;Password=***'" providerName="System.Data.EntityClient"/>
</connectionStrings>
Glovbal.asax にスキャフォールドの設定を行う。

以下の行がコメントアウトされているので、コメントを外し、ScaffoldAllTables を true にする。RegisterContext の値を今回生成したものに合わせる。

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

実行開始

おお、表示されましたね!
でも、全件取得しちゃうんでしょうか、でかいテーブルがすごく辛い状況に。。

フィルタや検索、認証なんかも実装できれば開発ツールとして使えそうですね!