更新日: 2010 年 1 月 15 日

C# の内容はこちらに掲載しています。概念モデルを使用したデータ アクセス (Entity Client) (C#)

このコンテンツのポイント

Entity SQL を使用して、概念モデルからデータを取得する方法を理解する

今回紹介するコード

Visual Basic
Imports System.Data
Imports System.Data.EntityClient

Sub Main()
	Using connection As New EntityConnection("Name=PUBSEntities")
		connection.Open()
		Dim command As EntityCommand = connection.CreateCommand()
		command.CommandText = _
		"SELECT VALUE p FROM PUBSEntities.[Publisher設定] AS p"
		Dim reader As EntityDataReader = _
		command.ExecuteReader(CommandBehavior.SequentialAccess)

		While reader.Read()
			Console.WriteLine(reader("pub_name"))
		End While
		connection.Close()
		Console.Read()
	End Using
End Sub
 

目次

  1. はじめに
  2. EDM の確認
  3. Entity SQL の概要
  4. コーディング
  5. サンプルの実行
  6. EntityConnection について
  7. EntityCommand について
  8. EntityDataReader について
  9. EDM のメリット
  10. おわりに

1. はじめに

ここでは、10 行でズバリ !! 概念モデルの作成 (EDM) (VB) で作成したプロジェクトを使用し、すでに作成済みのエンティティ データ モデル (EDM) を用いて、実際にデータベースにアクセスする方法について解説します。
エンティティ データ モデル (EDM) を用いたデータ アクセスは、すでに 10 行でズバリ !! 概念モデルを使用したデータ アクセス (Object Service) で紹介した LINQ to Entities を使用する方法がありますが、ここで紹介する Entity Client の一種である Entity SQL は、SQL Server を扱う際に使用される SQL 言語 (T-SQL, Transact-SQL) と同様の構文 (厳密には文法は異なります) で EDM を用いたデータベースへのクエリーを実行するためのフレームワークです。

ページのトップへ


2. EDM の確認

10 行でズバリ !! 概念モデルの作成 (EDM) (VB) で作成したコンソールアプリケーションでは、すでに Visual Studio の EDM デザイナー上にEmployee と Publisher の 2 つのエンティティを作成しています。

図 1. 作成済みのエンティティ データ モデル

コート上では、これらのエンティティは以下のクラスとして扱われます (以下の EntityObject クラスは System.Data.Objects.DataClasses 名前空間のクラスです)。

  1. EntityObject クラスの派生クラスである「Employee クラス」
  2. EntityObject クラスの派生クラスである「Publisher クラス」

これらのクラスは、EDM から自動生成された コード ファイル (今回は Pubs.Designer.vb) で定義されています。このファイルはソリューション エクスプローラー上でダブルクリックして開いて、その内容を確認できます。

図 2 エンティティ データ モデルから自動生成されたコード

ページのトップへ


3. Entity SQL の概要

Entity SQL では、EDM からデータを取得する際にポイントとなるのは以下の 3 つのクラスです。

  1. EntityConnection
  2. EntityCommand
  3. EntityDataReader

これらのクラスは System. Data.EntityClient 名前空間にあります。ADO.NET のプログラミング経験 (10 行でズバリ !! 接続型のデータアクセス (ADO.NET) (VB) を参照) がある方であれば、各クラス名の「Entity」の部分を「Sql」や「Oracle」に置き換えてみると、それぞれのクラスの役割が理解できるのではないでしょうか?つまり、EDM に対する接続を実行するクラス (EntityConnection)、EntityConnection 上でクエリーやストアド プロシージャのようなコマンドを実行するクラス (EntityCommand)、EntityCommand が実行したコマンドがクエリーの場合に、クエリーの処理結果を取得するためのカーソルの役割を果たすクラス (EntityDataReader) が Entity SQL の主要クラスです。まさに、ADO.NET の接続型データ アクセスで使用するクラスと同様であることが分かります。

ページのトップへ


4. コーディング

Module1.vb ファイルを開き、まずは Entity SQL の主要クラスを使用するための名前空間の修飾を追加します。

Visual Basic
Imports System.Data;
Imports System.Data.EntityClient;
 

次に Main メソッド内に以下のコードを記述します。

Visual Basic
Sub Main()
	Using connection As New EntityConnection("Name=PUBSEntities")
		connection.Open()
		Dim command As EntityCommand = connection.CreateCommand()
		command.CommandText = _
		"SELECT VALUE p FROM PUBSEntities.[Publisher設定] AS p"
		Dim reader As EntityDataReader = _
		command.ExecuteReader(CommandBehavior.SequentialAccess)
			While reader.Read()
			Console.WriteLine(reader("pub_name"))
		End While
		connection.Close()
		Console.Read()
	End Using
End Sub
 

ページのトップへ


5. サンプルの実行

上記コードの入力が終わったら、[F5] キーを押してデバッグ実行します。コマンドプロンプトが起動し、pubs データベースから取得されたデータから、publishers テーブルの pub_name (出版社の名前) 列のデータが表示されます。

図 3. サンプルプログラムの実行

ここで記述したコードには、pubs データベースへの接続や、publishers テーブルの名前と言ったデータベース構造固有の情報は一切ありません (pub_name は publishres テーブルの列名のように思いますが、EDM のスカラ プロパティ名であり、EDM の作成時に異なる名前に変更することもできます)。これは、ADO.NET Entity Framework の一番の特徴であり、開発時のメリットです。EDM がデータベース構造固有の情報を完全に隠ぺいしているため、ビジネス ロジックの開発者はそれらを一切意識する必要がありません。これは、ビジネス ロジックの開発時はもちろん、開発後、万が一データベース構造に変更が入った場合にも大きなメリットとなります。

これらのポイントをふまえて、以下に簡単に今回のコード (ここで使用したクラス) を解説します。

ページのトップへ


6. EntityConnection について

EntityConnection は接続文字列の指定がポイントとなります。データベース サーバーに接続するのではなく、プロジェクト内に作成した EDM に接続することになります。接続文字列として指定している名前は、プロジェクトに ADO.NET Entity Data Model の項目を追加した際に起動したウィザードで指定したものです。

図 4. Entity Data Model ウィザードでデータ接続を選択

EDM への接続情報の名前を忘れてしまった場合は、App.Config ファイルに定義されています。

Open メソッド、Close メソッドに関しては、SqlConnection クラスなどと同様です。(10 行でズバリ !! 接続型のデータ アクセス (ADO.NET) (VB) を参照)

ページのトップへ


7. EntityCommand について

EntityConnection オブジェクトの CreateCommand メソッドによってインスタンスが生成され、CommandText プロパティに Transact-SQL のようなコマンドを記述しました。ただし、このコマンドは Transact-SQL とは異なります。例えば、今回の例ではすべての列のデータを取得するコマンドですが、その指定方法は Transact-SQL の [*] を使用するのではなく、[Value] を使用しています。Entity SQL の詳細は Entity SQL の概要 を参照してください。

ポイントはデータベースに対するクエリーのコマンドを指定するのではなく、EDM というオブジェクトに対するクエリーのコマンドを指定する点です。クエリーの対象は異なりますが、よく似たコマンドであり、さらに、クエリーにパラメータを渡す必要があるような場合も、EntityPrameter クラスが用意されており、ADO.NET の接続型データ アクセスと同様のコードでデータベースを意識しないコーディングが実現できるという点です。

ページのトップへ


8. EntityDataReader について

ADO.NET の SqlDataReader クラスと同様です (10 行でズバリ !! 接続型のデータアクセス (ADO.NET) (VB) を参照)。今回データを取得する Publisher エンティティにはバイナリ データが含まれているため、SequentialAccess の指定をしないとエラーになります。

ページのトップへ


9.EDM のメリット

10 行でズバリ !! 概念モデルの作成 (EDM) (VB) で解説したように、今回のサンプルコードを実行した場合、Pubs データベースの Publisher テーブルと Pub_Info テーブルからデータが取得されます。例えば、データを表示する部分を以下のように変更し、再度実行してみましょう。

Visual Basic
Console.WriteLine(reader("pr_info"))
 

図 5. 表示するスカラ プロパティを変更して再実行

元のコードは Publishers テーブルの pub_name 列のデータが表示されていましたが、今度は Pub_Info テーブルの pr_info 列の内容が表示されたはずです。ただし、EDM にアクセスするコード (ビジネス ロジック) からは、どのテーブルに格納されているデータを表示するかを意識する必要がありません。Entity Framework が必要となるデータベースへのクエリーを作成するため、ビジネス ロジック開発者はデータベースのスキーマを意識する必要はありません。

ページのトップへ


10. おわりに

10 行でズバリ !! 概念モデルを使用したデータ アクセス (Object Service) で紹介した LINQ to Entities ではデータの取得だけでなく、更新、追加、削除を行うことができました。一方、今回紹介した Entity SQL では、データの読み取りしか行うことができません (ストアド プロシージャを呼び出すことができるため、厳密には更新、追加、削除ができます)。しかし、ユーザーの操作やビジネス ロジックの流れによって動的にクエリーを組み立てる必要があるような場合、LINQ では実装が困難になる場合もあります。そんな時には Entity SQL を活用してください。

ページのトップへ


Code Recipe

ページのトップへ