更新日: 2009 年 12 月 11 日

C# の内容はこちらに掲載しています。10 行でズバリ !! 概念モデルを使用したデータ アクセス (Object Services) (C#)

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

  • LINQ to Entities によるデータの参照
  • オブジェクト コンテキストによるデータの追加/更新/削除

今回紹介するコード

Visual Basic
Module Module1

    Sub Main()

        Dim context As New PUBSEntities()

        Dim query = From n In context.Publisher設定 _
                    Where n.pub_id = "1756" _
                    Select n

        Dim targetPub = query.First()

        targetPub.pub_name = "Endo Syuppan"
        targetPub.city = "Tokyo"
        targetPub.state = Nothing
        targetPub.country = "Japan"

        context.SaveChanges()
    End Sub

End Module
 

目次

  1. はじめに
  2. EDM の確認
  3. オブジェクト コンテキストの利用
  4. LINQ to Entities による参照処理
  5. 追加、更新、削除処理
  6. おわりに

1. はじめに

ここでは 10 行でズバリ !! 概念モデルの作成 (EDM) (VB) で作成したプロジェクトを使用し、すでに作成済みのエンティティ データ モデル (EDM) を用いて、実際にデータベースにアクセスする方法について解説します。具体的には、LINQ to Entities と呼ばれるフレームワークを使用し、LINQ によるクエリを用いてデータベースを参照します。また、レコードの追加、更新、削除の方法についても解説します。

ページのトップへ


2. EDM の確認

すでに Visual Studio の EDM デザイナー上では、Employee と Publisher の 2 つのエンティティを作成しています。

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

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

  • EntityObject クラスの派生クラスである「Employee クラス」
  • EntityObject クラスの派生クラスである「Publisher クラス」

これらのクラスは、EDM から自動生成された VB ファイル (今回では Pubs.Designer.vb) で定義されています。このファイルの内容を確認するには、Visual Studio の [プロジェクト] メニューで [すべてのファイルを表示] を実行し、ソリューション エクスプローラーで Pubs.edmx を展開してから、Pubs.Designer.vb をダブルクリックして開きます。

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

ページのトップへ


3. オブジェクト コンテキストの利用

Pubs.Designer.vb の内容を見ると、Employee クラスと Publisher クラスの他に、「PUBSEntities クラス」が含まれているのが分かります。これは「オブジェクト コンテキスト」と呼ばれるもので、System.Data.Objects 名前空間の ObjectContext クラスの派生クラスです。

オブジェクト コンテキストは、EDM で定義されたエンティティのデータを操作するためのもので、データベースへの接続なども管理しており、このオブジェクトをベースとして、データベースに対する問い合わせや、追加、更新、削除が可能になります。

以下ではオブジェクト コンテキストを用いて、参照処理、そして追加/更新/削除処理を記述していきます。

ページのトップへ


4. LINQ to Entities による参照処理

参照処理は、エンティティに対して LINQ によるクエリを実行することで行えます。ADO.NET Entity Framework において、エンティティに対する LINQ の処理は、特に「LINQ to Entities」と呼ばれます。LINQ to Entities の機能は、主にオブジェクト コンテキストで実装されています。

図 2 の画面で表示している Pubs.Designer.vb の中をよく見ると、オブジェクト コンテキストである PUBSEntities クラスのプロパティには、以下の 2 つのプロパティが実装されています。ちなみに、これらのプロパティ名が「~設定」という形式の名前になっているのは、EDM デザイナー上でエンティティ名やプロパティ名を変更したためです。この名前は EDM デザイナーでエンティティの [エンティティ セット名] プロパティの値を [プロパティ] ウィンドウで修正して変更できます。

これら ObjectQuery (Of T) 型のインスタンスは、オブジェクト コンテキストに対するクエリを表すオブジェクトです。つまり、PUBSEntities クラスのインスタンス化を行うと、すでにクエリ用のオブジェクトも作成されていることになります。

従って、以下のようなコードにより、PUBS データベースの employee テーブル (このテーブルは Employee エンティティに対応) から全データを取得できます (ここでは社員の ID と氏名のみを表示しています)。このコードはソリューション エクスプローラーからプロジェクト内の Module1.vb を開いて入力します。太字部分が手で入力するコードです。

Module Module1

    Sub Main()

        Dim context As New PUBSEntities()

        For Each emp As Employee In context.Employee設定

            Console.WriteLine(emp.emp_id + " : " + emp.fname + " " + emp.lname)

        Next
        Console.ReadLine() ' 一時停止用

    End Sub

End Module

Visual Studio で [F5] キーを押してアプリケーションを実行すると、実行結果は次のようになります。

図 3 Employee エンティティの全データを表示

ちなみに、上記のコードでは Employee 型の変数 emp を使用していますが、これには Employee エンティティのインスタンスが入ります。

LINQ to Entities の処理は、このクエリに対して、さらにフィルタリング等を行うことで実現されています。つまり、以下のように記述してデータの絞り込みが可能です。

Module Module1

    Sub Main()

        Dim context As New PUBSEntities()

        Dim query = From n In context.Employee設定 _
            Where n.fname.StartsWith("P") _
            Select New With {n.emp_id, n.fname}

        For Each emp In query

            Console.WriteLine(emp)

        Next
        Console.ReadLine() ' 一時停止用
    End Sub

End Module

この実行結果は次のようになります。

図 4 「P」で始まる名前を持つ Employee エンティティのデータ

エンティティ間のリレーションを示すナビゲーション プロパティを使用して、エンティティにまたがったクエリも可能です。以下は、米国にある出版社の社員のリストを表示します。

Module Module1

    Sub Main()

        Dim context As New PUBSEntities()

        Dim query = From n In context.Employee設定 _
            Where n.Publisher.country = "USA" _

            Select New With {n.emp_id, n.fname, n.Publisher.country}

        For Each emp In query

            Console.WriteLine(emp)

        Next
        Console.ReadLine() ' 一時停止用
    End Sub

End Module

ここではクエリの結果をコンソールに表示していますが、DataGridView などのコントロールにデータ バインドすることも可能です。

ページのトップへ


5. 追加、更新、削除処理

オブジェクト コンテキストでは、クエリ以外にも、データの追加、更新、削除を行い、それをデータベースに反映することができます。

データの追加は、新しいエンティティのインスタンスを作成し、オブジェクト コンテキストに自動生成されている「AddTo ~」で始まるメソッドを使用して行います。以下では、"AddToPublisher 設定" メソッドにより、新しい出版社をデータベースに追加しています。そして最後に SaveChanges メソッドを呼び出し、オブジェクト コンテキストでの変更をデータベースに反映します。

Module Module1

    Sub Main()

        Dim context As New PUBSEntities()

        Dim newPub As New Publisher()
        newPub.pub_id = "9900"
        newPub.pub_name = "MyNewPublisher"
        newPub.pr_info = "This is My New Publisher"

        context.AddToPublisher設定(newPub)

        context.SaveChanges()
    End Sub

End Module

このコードでは pr_info プロパティを設定しているため、実際には publishers テーブルだけでなく、pub_info テーブルにもレコードが追加されます。これは Publisher エンティティが、publishers と pub_info の 2 つのテーブルへマッピングされているためです。

データの更新は、変更したいデータをクエリにより取り出し、そのプロパティを変更した後、SaveChanges メソッドを呼び出します。以下に記述例を示します。

Module Module1

    Sub Main()

        Dim context As New PUBSEntities()

        Dim query = From n In context.Publisher設定 _
            Where n.pub_id = "1756" _
            Select n

        Dim targetPub = query.First()

        targetPub.pub_name = "Endo Syuppan"
        targetPub.city = "Tokyo"
        targetPub.state = Nothing
        targetPub.country = "Japan"

        context.SaveChanges()
    End Sub

End Module

このような処理が可能であるのは、ObjectQuery (Of T) 型のインスタンスからクエリにより返される個々のエンティティ オブジェクトが、オブジェクト コンテキストによって追跡されているためです。

最後に削除処理の記述例です。これは、削除したいデータのエンティティ オブジェクトを引数に指定して、DeleteObject メソッドを呼び出します。

Module Module1

    Sub Main()

        Dim context As New PUBSEntities()

        Dim query = From n In context.Publisher設定 _
            Where n.pub_id = "1756" _
            Select n

        Dim targetPub = query.First()

        context.DeleteObject(targetPub)

        context.SaveChanges()
    End Sub

End Module

ページのトップへ


6. おわりに

EDM におけるデータ アクセスは、実は他にもいくつかの方法があるのですが、ここではオブジェクト コンテキストに関するものをご紹介しました。

ここでも利用した、System.Data.Objects 名前空間および System.Data.Objects.DataClasses 名前空間で提供されている機能は、総称して「Object Services」と呼ばれます。オブジェクト コンテキストは、Object Services の 1 機能です。


Code Recipe

ページのトップへ