July 2011

Volume 26 Number 07

この記事は機械翻訳されたものです。

データ ポイント - Entity Framework 手法の解明: 第 3 部: クラス、クエリ、およびコンテキスト (機械翻訳)

Julie Lerman | July 2011

Julie Lermanこれは、いくつか重要なときに、エンティティ フレームワークを使用して、データ アクセス層では、アプリケーションとして意思決定支援を目指してデータ ポイント列のシリーズで 3 番目です。2011 年 5 月号のモデル作成のワークフローについて、最初 (bit.ly/lOcjPz)、議論の間でコード最初、モデル最初とデータベースのワークフローを選択します。コードが最初は visual モデルを使用しないがデータベースとモデルの最初の操作を行います。ドメイン クラスから作成します visual モデルがこの列のターゲットのいずれかのコード生成オプションに焦点を当てます。コード生成のトピックが、私は ObjectContext と DbContext を使用して ~ LINQ to エンティティとエンティティの SQL の選択の選択を簡単に説明を取る。

生成されたクラス: EntityObjects か Poco

エンティティ フレームワーク (EF これから簡潔にするため) の最初のバージョンは関係およびエンティティのインスタンスの変更の履歴管理、ObjectContext と相互作用するエンティティを有効にするには、EntityObject クラスに依存。コードの生成、モデルから生成されたクラス EntityObject を継承することを確認しました。まだ、既定 Visual Studio 2010 が、今、別のオプションがあります。Microsoft では。NET Framework 4、EF、ObjectContext は、変更を追跡し、ObjectContext に通知を送信するには、EntityObject に応じてなしのエンティティ間の関係を管理する機能を得た。つまり、クラスは、もはや、永続性の無視、懸念、単体テストとアジャイル開発の一般化の傘の下で秋のソフトウェア プラクティスの分離に興味のある開発者にとって大きな違い EntityObject を継承する必要があります。

他の Api に依存しないクラスは普通の古い CLR オブジェクトまたは Poco として呼ばれます。これらクリーナーのクラスを使用するが、まだその変更の追跡および他のエンティティの管理タスクを実行するには、EF 能力にその「POCO のサポートとして」と呼ばれますこのサポート バックボーン コード最初を提供します。EF POCO エンティティにすることができますので、EF コンテキストによってコード最初のシナリオで作成するクラスを管理することもできます。

コンテキスト、エンティティへの変更の通知は、EntityObject EF 依存している場合は、どのようにそれ EntityObject を継承はありませんが、EF の知識がある Poco を持つことが可能ですか?EF では、2 つのパスを使用して有名なケーキをし、それを食べるも開発者ことができます。変更しない 1 つの事は、ObjectContext まだクラスは責任あることを認識する必要があることです。

POCO サポートの最初のパスの結果としてのも賢くなって ObjectContext から。ネット フレームワーク 4。今それを管理しているクラスを調べることです。それは、それを管理しているオブジェクトの読み取りし、それらのオブジェクトをトラックの状態情報を更新する DetectChanges などの新しいメソッドがあります。

EF することができます 2 番目の方法は、フレームワークから恩恵を受けて早技プロキシ オブジェクトの形でのビットを使用し、Poco を使用します。POCO クラスのプロパティのすべての 1 つが仮想マークされている場合は、EF ランタイム プロキシ (ラッパー) は、オブジェクトの周りを作成して、プロキシは、EntityObject と同じ仕事は。プロキシ クラスは、コンテキスト プロパティとの関係の変更の通知します。クラス全体に影響を与えず、プロキシを利用することもできます。EF でもその他のプロパティがないという仮想、マークされている遅延ロード ナビゲーション プロパティにできます。

図 1EntityObjects または 2 つの POCO メカニズムを使用して、エンティティの変更を追跡するには、ObjectContext を現在利用可能な 3 つの方法の視覚的な表現を示しています。

エンティティ フレームワーク トラックがどのように変化のエンティティ

図 1エンティティ フレームワーク トラックがどのように変化のエンティティ

ObjectContext か DbContext。

EF 4.1 DbContext と呼ばれる ObjectContext の軽量バージョンを導入しました。ObjectContext として同じ POCO サポートのすべてを提供します。DbContext もいくつかの単純なメソッドとプロパティの ObjectContext に対してのコーディングに必要なより複雑なロジックのコーディング作業の最も一般的な EF で実行しやすくをラップします。

DbContext はコードの最初のクラスでは、使用する既定のコンテキストが、ObjectContext は、既定データベースとモデルの最初の。Microsoft 代替コード生成テンプレートを後者の 2 つのモデルを提供します。最初は ADO です。歩エンティティ ジェネレーターを純します。これは POCO クラスを管理するには、ObjectContext クラスと共に作成されます。2 番目の EF 4.1 インストールは ADO です。ネット DbContext ジェネレーター。これも POCO クラスを作成します。しかし、DbContext から、クラスを管理するために生成されるコンテキスト クラスを継承します。従ってどちらのワークフロー開始を — コード最初、モデル最初またはデータベース最初 — は、あなたの好みの場合は DbContext を使用するオプションがあります。必要な場合を取得することができますので、DbContext、ObjectContext にウィンドウがあります。

クエリのオプション:LINQ to Entities または Entity SQL

開発者について EF がもう一つの大きな問題は、彼らを記述し、クエリを実行する LINQ をエンティティまたはエンティティ SQL を使用するかどうかです。彼らも、2 つの存在理由を尋ねます。エンティティ SQL は、エンティティ データ モデルと一緒にそのネイティブ クエリ構文として建設されました。LINQ は c# と Visual Basic の拡張し、言語チームによって作成されました。データ プラットフォーム グループ LINQ に仕事について学んだときに、彼らは、LINQ to エンティティ実装を作成するので自然な拡張子は、EF でクエリのニーズになる知っていた。

既定のクエリ戦略としてのエンティティへの LINQ

LINQ to Entities は LINQ to Objects の実装です。LINQ では、厳密に型指定されたオブジェクトとの場合のクエリを作成することができます、EF をエンティ ティー クラスに対してクエリを記述することができます。LINQ は、2 つの方法で表されます。最初の演算子です。クエリ ステートメント少しは SQL ステートメントのように見えます。クエリでは、EntityContainer は、ここでコンテキストと呼ばれる、ObjectContext から継承のインスタンス必要があります。

 

IQueryable<Family> query =
  from f in context.Families where f.Pets.Any() select f;

この式を入力すると、IntelliSense も LINQ 構文だけでなく、厳密に型指定されたクラスに、役立ちます。 クエリは、IQueryable の家族型を返します。 クエリは、まだ、たとえば ToList を実行する必要があります。

List<Family> reptileFamilies = query.ToList();

これは、データベースにクエリを実行、データベースから結果を取得し、それらの結果を使用してオブジェクトを作成するには、EF が発生します。

LINQ クエリを表す 2 番目の方法で LINQ メソッドです。 これらのパラメーターとしてラムダ式が必要です。 1 つの LINQ クエリに 2 つの前のステートメントを圧縮します。

List<Family> reptileFamiles = 
  context.Families.Where(f=>f.Pets.Any()).ToList();

LINQ が非常に高速のクエリに使いやすいので — 感謝に厳密な型指定、IntelliSense — 一般的に開発者は、デフォルトのクエリ方法として LINQ を使用する計画を立てることをお勧めします。 さまざまな linq クエリを表すことができます。 さらに、LINQ の多くの実装があるため、それを使用して、良いハンドルを既に必要があります。 そうでない場合は、最も可能性の高いエンティティへの LINQ の学習と他のコーディングの問題を解決するために LINQ オブジェクトか、多くの他のフレーバーの LINQ のいずれかを使用してからメリットがあります。 また、LINQ でクエリを実行する方法を学習の多くの偉大なリソースを見つけることができます。

エンティティ SQL のエッジ ケース クエリと他の言語

Entity SQL 文字列ベースのクエリ構文です。 Entity SQL を使ったクエリを実行するには、EF ObjectQuery を使用すると、Entity SQL 式を渡す必要があります。 何がようか。 例はここにあります。

string eSql = "SELECT VALUE f FROM PetsModelContainer.Families AS f";
ObjectQuery<Family> query = context.CreateQuery<Family>(eSql);
List<Family> families = query.ToList();

 

LINQ を作成、IQueryable のようなこの ObjectQuery はまだデータベースから結果を取得するために実行する必要があります。ObjectQuery エンティティ SQL のスニペットをパラメーターとして受け取るメソッドを使用してクエリを作成する代替方法を提供しています。

しかし、文字列式は、厳密な型指定していないクエリ式実行時まで解決を取得しないことをそれまでの問題を見つけることはできませんが。(不可欠の LINQPad を使用することができます — で発見linqpad.net— エンティティ SQL は Visual Studio の外部のエンティティへの LINQ をテストします)。なぜ誰も Entity SQL を使用するだろうか?

いくつかの理由があります。

あなたのコードの言語から始めましょう。LINQ は、c# および Visual Basic の一部です。パワーパック F # は、LINQ を提供です。場合は、その他のコードを記述します。NET 言語は、LINQ を使用することはできません。しかし、Entity SQL を使用してクエリを表現することができます。私も Entity SQL 役に立つアプリケーションで複雑な検索ユーティリティを構築するため発見しました。LINQ がコンポーザブルであるが、特定の時点で、それは単に文字列を構築する容易になります。

接続とコマンドと、Entity SQL 式を使用して、EF で下位レベルのクエリを実行することもできます。このパスは、ストリーミングされたデータを返すし、レポートまたはデータの移動に最適です。

クエリ、コード生成およびコンテキスト オプション

LINQ to Entities を使用して、既定のクエリ方法としてをお勧めしますが、エッジの場合 Entity SQL を利用する理由を見てきました。これは何し、クライアントには、私がお勧めです、私はいつも私の使用頻度の低いエンティティ SQL のチョップを行使するための口実満足します。MSDN のドキュメントを Entity SQL 式を作成する方法を学習することのかなり徹底的です。しかし、それ以外は、EF チームと、章私の本は、「Entity Framework のプログラミング」(o ' Reilly の構文を学習のための多くのリソースを認識ではないメディア、2010年)、いくつかの昔のブログの記事。

単純なアプリケーションを作成しているだけで動作することをするとコード生成の面では、EntityObjects を使用しては良い戦略です。ただし、永続化無知クラスがあるアプリケーションを設計している場合は、単体テストを使用してはまさに何 EF POCO サポート用に作成された関心の分離のパスを実行します。その後も、コーディングやその仕事で少し干渉 EF はできるようになる、プロキシ生成を活用するとは少し余分な注意を必要とする純粋なオブジェクトを使用していくつかの柔軟性があります。

EF 4.1 POCO クラスを管理するには ObjectContext または DbContext 間の選択は、コードの生成を 1 つ以上のオプションを追加します。それをするには、単純な API があるので多くの開発者に DbContext ジャンプしています。詳細な変更追跡者との対話を細かく制御が必要な場合または好む活用して既存のコードや、ObjectContext の知識に引き続きは、ObjectContext としてあなたのコンテキストを使用することができます。

Julie Lerman 、Microsoft MVP であります。ネットのメンターとバーモント州の丘に住むコンサルタントデータ アクセスおよび他の Microsoft の彼女の提示を見つけることができます。ユーザー グループとは、世界中のカンファレンスでの純トピック。彼女のブログでthedatafarm.com/blogと非常に高く評価さの本は、「Entity Framework のプログラミング」(オライリー メディア、2010) の著者です。彼女に Twitter に続くtwitter.com/julielerman

この記事のレビュー、技術スタッフに感謝:30