PostgreSQLでEntity Framework

Entity Frameworkといえば、SQLServerでしか利用できないと思われがちですが、他のデータベースでも利用できます。
今回PostgreSQLMySQLで試してみたので纏めておきたいと思います。


検証するにあたり、「かずきのBlog」さんを参考にさせていただきました。

http://blogs.wankuma.com/kazuki/archive/2009/04/06/170812.aspx


まずPostgreSQLMySQLでの利用については次のエントリーで)。


今回の検証は以下の環境にて行いました。


上記のものが正常に動作しているという前提で以下に纏めます。

Npgsql .Net データプロバイダのダウンロード

PostgreSQLデータベースサーバーと同時にインストールされるApplication Stack Builderからインストールもできるのですが、.NET4.0ビルドのものが表示されないので以下からダウンロードして適当なフォルダに解凍してします。

http://pgfoundry.org/frs/download.php/2650/Npgsql2.0.9-bin-ms.net4.0.zip

GACへの登録

解凍したフォルダ直下にNpgsql.dllとMono.Security.dllがあるので、これらを以下のコマンドでGACに登録します。

# gacutil -i Npgsql.dll
# gacutil -i Mono.Security.dll

登録済を確認する場合は-l、削除する場合は-uです。

machine.configへの追記

のDbProviderFactoriesセクションの最後に以下を追記します。

<add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.9.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />

EDM ジェネレーター (EdmGen.exe) ツールの使用

適当なフォルダにて以下のコマンドを実行します。

# edmgen.exe /provider:Npgsql /mode:fullgeneration /c:"Port=5432;Encoding=UTF-8;Server=localhost;DatabaseXXXXXX;UserId=XXXXXX;Password=XXXXXX" /project:MvcSampleDB

うまくいくと、

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

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

のメッセージが出力され

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

の5つのファイルが作成されます。
今回はedmgenコマンドのオプションで/project:MvcSampleDBと指定したので上記のようなファイル名になっています。
またnamespaceもMvcSampleDBとなります。

これら5つのファイルをVisual Studioにて作成したプロジェクトに追加します。
MvcSampleDB.csdl、MvcSampleDB.msl、MvcSampleDB.ssdlについては、プロパティのビルドアクションを「埋め込まれたリソース」に変更しておいてください。

アプリケーション構成ファイル(App.config等)への追記

アプリケーション構成ファイルのconnectionStringsセクションに以下を追記します。

<add name="MvcSampleDBContext"
    connectionString="metadata=res://*/MvcSample.Data.MvcSampleDB.csdl|res://*/MvcSample.Data.MvcSampleDB.msl|res://*/MvcSample.Data.MvcSampleDB.ssdl;provider=Npgsql;provider connection string=&quot;Server=localhost;Port=5432;UserID=XXXXXX;Password=XXXXXX;Database=XXXXXX&quot;"
    providerName="System.Data.EntityClient"/>

nameの値には先ほどedmgenコマンドのオプション/:projectで指定した名称+DBContext(今回の場合はMvcSample+DBContext)を指定してください。
MvcSampleDB.csdl、MvcSampleDB.msl、MvcSampleDB.ssdlについては、実際のプロジェクトでのパスに合わせて修正してください。

さぁ実行してみましょう!

以上で準備は完了です。あとはSQLServerの場合と同じように使用します。

var members = from x in ctx.member
              where x.age > 10
              orderby x.age
              select x;

今回はASP.NET MVC 2.0 な環境で試してみましたが、いつもどおり利用することができました。

引き続きMySQLでEntity Frameworkはこちら