SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Scott Guthrie氏 Blog翻訳

既存のデータベースでEF『コード・ファースト』を使用

連載:ScottGu's Blog翻訳

ステップ 6:モデル・クラスの使用

 では、データベースからいくつかのデータを表示するためにNorthwindモデル・クラスを使用する(非常に)簡単なページを書いてみましょう。

 まずASP.NETプロジェクトに新しいページを追加します。Webプロジェクト上で右クリックし、[追加]-[新しい項目]を選択し、マスターページを使用したWebフォーム項目テンプレートを選択します。そのページにProducts.aspxという名前をつけて、デフォルトでASP.NET Webプロジェクトスターターテンプレートに含まれているSite.masterマスターページを使用するようにします。

 新しいProducts.aspxページに<asp:GridView>コントロールを追加します。Productsの名前と価格だけ表示されるように構成します。

 そしてコードビハインド・ファイル内でモデル・クラスに対して以下のLINQクエリを書くとすべてのアクティブな製品をデータベースから取得して上記のGridViewコントロールにバインドできます。

 これでプロジェクトを実行しProducts.aspxを表示させると、次のようなProductsの一覧が得られます。

 これで既存のデータベースに対してEF『コード・ファースト』を使用する簡単なアプリケーションができました。

ダウンロードサンプル

 上記サンプルの完成版はここからダウンロードできます。EF『コード・ファースト』 CTP4とSQL Expressがインストールされていることが前提になっています。

追加のコード例

 その他のよくあるシナリオでNorthwindモデルをどのように使用できるかを表した追加のコード例を、いくつか紹介します。

リレーション間のクエリ

 以下のLINQクエリはそれぞれが属するCategory名に基づいて一連のProductオブジェクトを取得するところを表しています。着目して欲しいのは、Productとその関連のCategoryオブジェクトのサブプロパティの両方をSPANするLINQクエリをどのように書いているかです。その実際のフィルタはデータベースエンジン自身ですべて完了しているので、Productオブジェクトはただ中間層に戻されるだけです(効率化のため)。

1つのProductを取得するためにFindメソッドを使用

 LINQクエリが書けるだけでなく、EF『コード・ファースト』はDbSet<T>コレクションでFind()メソッドのサポートもしているので、次のようなコードを書いてそのIDに基づく1つのインスタンスを取得できます。

新しいCategoryの挿入

 以下のコードは新しいCategoryをデータベースへ追加する方法を示しています。

 どのようにCategoryオブジェクトを作成し、それにプロパティを割り当てた後、コンテキストのCategoriesコレクションにそれを追加するのかを確認してください。その後、SaveChanges()をコンテキスト上で呼び出し、データベースへ更新を永続化できます。

新しいCategoryとProduct(および関連するもの)の挿入

 以下のコードは、新しいCategoryと新しいProductを作成し、その新しいCategoryに帰属させるためにProductを関連付けて、その後データベースに両方を保存する方法を表しています。

 上記では、どのように、そのCategoryインスタンスをポイントするCategoryプロパティを割り当てることで新しく作成されたCategoryを参照する新しいProductを持てるのかを確認してください。明示的にCategoryID外部キープロパティを設定する必要ありません。これは自動的にデータベースへ変更が永続化された時に行われます。

 EFは作業単位と呼ばれるパターンを使用しています。これはコンテキストへ複数の変更を記録して、SaveChanges()が呼ばれた時に1つの単体トランザクションですべてを一緒に永続化できるという意味です(つまりすべての変更が成功するかどれも成功しないかということです)。これにより簡単にデータベースを(いくつかの変更が適用されそれ以外がされていないような)矛盾した状態のままにならないようにできます。

 上記のコードスニペットではCategoryとProductの両方が永続化されるか、どちらもされない(そして例外が発生)かのいずれかになります。

Productを更新して再保存

 以下のコードはProductを取得して更新し、データベースへそれを再保存する方法を示しています。前にFind()メソッドを使用してProductIDに基づいた製品を取得する方法を示しました。以下はそのProductNameに基づく特定の製品を取得するLINQクエリを使用しています。

 (すべての既存のオブジェクトに対する)変更(または新しい追加も)はいくらでもできます。SaveChanges()を呼び出したとき、1つのトランザクションですべてがデータベースに永続化されます。

次のページ
デフォルトの規約 vs. 独自のマッピング・ルール

この記事は参考になりましたか?

Scott Guthrie氏 Blog翻訳連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト Chica(チカ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Guthrie(Scott Guthrie)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5400 2010/09/01 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー