PostgreSQLでEntity Framework
Entity Frameworkといえば、SQLServerでしか利用できないと思われがちですが、他のデータベースでも利用できます。
今回PostgreSQLとMySQLで試してみたので纏めておきたいと思います。
検証するにあたり、「かずきのBlog」さんを参考にさせていただきました。
http://blogs.wankuma.com/kazuki/archive/2009/04/06/170812.aspx
まずPostgreSQL(MySQLでの利用については次のエントリーで)。
今回の検証は以下の環境にて行いました。
- PostgreSQL 8.4.4 Windows版
- Visual Studio 2010
- .NET Framework 4.0
上記のものが正常に動作しているという前提で以下に纏めます。
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への追記
- C:\Windows\Microsoft.NET\Framework\v4.0.30319\CONFIG\machine.config
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\CONFIG\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="Server=localhost;Port=5432;UserID=XXXXXX;Password=XXXXXX;Database=XXXXXX"" 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はこちら