fc2ブログ

PostgresのテーブルからEntityクラスの自動生成

ここまでの作業の中で、すでにいくつかのテーブルとビューが出来上がっています。これらに対してVBから読み出したり、あるいは、書き込んだりするわけですが、このときに、テーブル1つに対応するクラスが1つ必要になります。データのやり取りをこのクラスを通じて行うわけです。このクラスは一般にEntityクラスと呼ばれています。
通常、このEntityクラスは、テーブルとは別に自分で実装する必要があり、フィールドの型に合わせて、変数の型も注意深く決める必要があります。また、テーブルの構造(スキーマ)に変更があると、実装も変更しなければならないのです。
この手間をなくすために、EntityManagerという仕組みが用意されています。EntityManagerを使うと、テーブルの構造から変数の型を合わせてEntityクラスを自動生成してくれるのです。
スポンサーリンク
手順は以下のようになります。
  1. 最新のMicrosoft Windows SDKをインストールします。コントロールパネルの「プログラムと機能」でインストールされている「Microsoft Windows SDK」のバージョンが確認できます。インストールされていない、もしくは、バージョンが7.1未満だった場合は、Microsoftのサイトからダウンロードして、インストールしておいてください(もちろん無料です)。また、すでにインストール済みだとは思いますが、「.NET Framework 4.0」もインストールされていることを確認しておいてください。
  2. コマンドプロンプトを開きます。(WindowsVista/7を利用している方は、管理者権限で開く必要があります。タスクバーのスタートボタンを押し、「プログラムとファイルの検索」欄に「cmd」と入力し、Shift+Ctrl+Enterを押してください。)
  3. VS2010のプロジェクトの配下でNpgsql.dllとMono.Security.dllをコピーしたディレクトリに移動します。
  4. 以下のコマンドを実行してください(Windowsのバージョンや32ビットか64ビットかなどの環境により、パスは異なるかもしれません)。

(WindowsXP)
> "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\x64\gacutil.exe" /i Npgsql.dll
> "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\x64\gacutil.exe" /i Mono.Security.dll

(WindowsVista/7)
> "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\x64\gacutil.exe" /i Npgsql.dll
> "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\x64\gacutil.exe" /i Mono.Security.dll
それぞれ、以下のように表示されます。

Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.

アセンブリが正しくキャッシュに追加されました。
もしくは、

Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.

Assembly successfully added to the cache
エクスプローラで、C:\WINDOWS\assemblyを開くと、2つのファイルが追加されていることが分かります。

  1. テキストエディタでC:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\machine.configを開きます(WindowsVista/7を利用している方は、管理者権限で開く必要があります)。64ビット版をご利用の場合は、Framework64フォルダの下になります。

  2. machine.configに以下のように追記し、保存します。

<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.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />

</DbProviderFactories>
</system.data>
<!-- 省略 -->
</configuration>

  1. PCを再起動します。
  2. コマンドプロンプトを開き、プロジェクトのディレクトリに移動し、以下のコマンドを実行します。ProjectNameは、VS2010のプロジェクト名と特に一致させる必要はありません。
> C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\EdmGen.exe /provider:Npgsql /mode:fullgeneration /c:"Port=5432;Encoding=SJIS;Server=localhost;Database=postgres;UserId=postgres;Password=xxxxxxxx" /language:VB /namespace:EdmName /project:ProjectName

  1. プロジェクトのディレクトリに[ProjectName].ssdlが生成されています。このファイルをテキストエディタで開きます。
  2. EntitySet要素に、ビューの行を追加します。テーブルの行をコピーして、ビュー名とstore:Typeを変更すればよいでしょう。

<EntitySet Name="v_xxx" EntityType="EdmName.Store.v_xxx" store:Type="Views" Schema="public" />

  1. EntityType要素のビューのコメントを解除します。[ProjectName].ssdlの下部に出力されているはずです。
  2. ビューの主キーに相当するKey要素を以下のように追記します。

<EntityType Name="v_xxx">
<Key>
<PropertyRef Name="key1" />
<PropertyRef Name="key2" />
</Key>
<!-- 省略 -->
</EntityType>
  1. ビューのNot Nullに相当するフィールドに、Nullable="false"を追記し、ファイルを保存します。

<Property Name="datetime" Type="timestamp" Nullable="false" />
  1. コマンドプロンプトを開き、プロジェクトのディレクトリに移動し、以下のコマンドを実行します。8.のコマンドとは、/modeと/inssdlが違っているので、注意してください。

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\EdmGen.exe /provider:Npgsql /mode:FromSsdlGeneration /c:"Port=5432;Encoding=SJIS;Server=localhost;Database=postgres;UserId=postgres;Password= xxxxxxxx" /inssdl:ProjectName.ssdl /language:VB /namespace:EdmName /project:ProjectName
上手くいくと、次のように表示されるはずです。

Microsoft (R) EdmGen version 4.0.0.0
Copyright (c) 2008 Microsoft Corporation. All rights reserved.

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

生成完了 -- エラー 0 件、警告 0 件
  1. プロジェクトのディレクトリに[ProjectName].ObjectLayer.vb、[ProjectName].Views.vb、[ProjectName].csdl、[ProjectName].msl、[ProjectName].ssdlが生成されています。生成されたこれら5つのファイルをプロジェクトに追加します。実は[ProjectName].ObjectLayer.vb、[ProjectName].Views.vbの2つのファイルにEntityクラスが自動生成されています。

  2. さらに、ソリューションエクスプローラーから[ProjectName].csdlを右クリックしてプロパティを選択し、プロパティを開きます。そして、ビルドアクションを「埋め込まれたリソース」にします。[ProjectName].msl、[ProjectName].ssdlも同様に、ビルドアクションを「埋め込まれたリソース」にします。

  3. ビルドすると、参照が足りないというエラーが出るので、System.Data.EntityとSystem.Runtime.Serializationをプロジェクトの参照に追加します。再度ビルドすると、エラーがすべて消え、作業は完了となります。お疲れ様でした。

/namespaceで指定したネームスペース配下にクラスが生成されており、コード補完なども行われます。確認してみてください。

もし、テーブルの構造(スキーマ)を修正した場合は、8.~17.のみを再度行えば、ソースコード(クラス)にも反映させることができます。
スポンサーリンク
<<インデックスを設定し検索を高速化する | ホーム | VBからデータベースのデータを操作する>>
コメント(0)
コメントの投稿
トラックバック(0)