Visual Studio Express で Entity Data Model を生成する
Entity Framework は、データをオブジェクトとして扱うための ORM(オブジェクトリレーショナルマッピング)フレームワークです。しかし、Visual Studio Express ではサードパーティの Entity Framework プロバイダーをデータソースとして使用するための統合機能が提供されていません。
この問題を解決する方法は2つあります。1つは Code-First アプローチを使用して Entity Data Model を手動で定義する方法、もう1つは本記事で解説する EDM ジェネレーター(edmgen)を使用してモデルを生成する方法です。本記事では QuickBooks Data Provider を例に説明しますが、同じ手順はすべての CData ADO.NET Data Provider で使用できます。
- Visual Studio Express で .NET Framework 4.0 を使用した Windows コンソールアプリケーションを作成します。
- System.Data.Entity.dll および System.Runtime.Serialization.dll アセンブリへの参照を追加します。
これで、データモデルを生成する準備が整いました。コマンドプロンプトを開き、プロジェクトディレクトリに移動して、以下のように edmgen.exe を実行します。'/c:' パラメータで接続文字列を渡す必要があります。接続文字列の例は各プロバイダーのドキュメントに記載されています。また、'/prov:' パラメータで適切な DLL を指定する必要があります。Visual Basic プロジェクトの場合は、language を 'VB' に設定してください。
"%windir%\Microsoft.NET\Framework\v4.0.30319\edmgen.exe" /mode:fullgeneration /prov:"System.Data.CData.QuickBooks" /c:"user=MyUserName;Password=MyPassword;URL=MyURL" /project:QBTest /entitycontainer:QuickBooksEntities /namespace:QBTest /language:CSharp
QuickBooks のデスクトップ版に接続するには、アプリケーションと一緒にインストールされる Remote Connector アプリケーションを使用します。Remote Connector は、リモートの QuickBooks インスタンスへの接続を可能にする軽量なスタンドアロンサーバーです。QuickBooks への直接 COM アクセスが利用できない状況(ASP.NET、Java、またはリモートマシン上の会社ファイルなど)でアプリケーションを QuickBooks に接続する場合にも使用されます。詳細と接続確立のステップバイステップガイドについては、ヘルプドキュメントの「はじめに」ガイドを参照してください。
- コマンドが完了すると、作業ディレクトリに5つの新しいファイルが作成されます:QBTest.csdl、QBTest.msl、QBTest.ObjectLayer.cs、QBTest.ssdl、QBTest.Views.cs です(language で VB を選択した場合は、.cs ではなく .vb ファイルになります)。これらのファイルをプロジェクトに追加します。
- プロパティタブで、.csdl、.msl、.ssdl ファイルの「出力ディレクトリにコピー」プロパティを「新しい場合はコピーする」に設定します。
- これで Entity Data Model を使用する準備が整いました。たとえば、以下のコードは Accounts テーブルに対して簡単なクエリを実行し、Id を取得します:


string conn = "metadata=./QBTest.csdl|./QBTest.ssdl|./QBTest.msl;provider=System.Data.CData.QuickBooks;provider connection string='User=MyUserName;Password=MyPassword;URL=MyURL;'";
QuickBooksEntities env = new QuickBooksEntities(conn);
var queryRet = from account in env.Accounts select account;
foreach (var results in queryRet) {
Console.WriteLine(results.ID);
}