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

データ ポイント

Entity Framework の Code First と DbContext に関してよく寄せられる質問 (機械翻訳)

Julie Lerman

 

Julie Lerman今月は、私は頻繁にコード最初とエンティティ フレームワーク 4.2 で DbContext について尋ねられる質問への答えを共有おきたいと思います。 スペースを最大化するには、私が提供する資料を補足する詳細情報を見つけることができますにリソースを追加をポイントします。

最初のコードは、DbContext を追加するには。ネット フレームワークですか?

第 最初のコードし、DbContext は、Microsoft から個別に配布されます。NET Framework のリリース サイクル、彼らの次の公式のリリースを待つことがなく準備ができているときに更新プログラムをリリースするには、エンティティ フレームワーク チーム。ネット フレームワーク。 最初のコードし、DbContext API 動的に NuGet を使用して、プロジェクトに追加することができます、EntityFramework.dll アセンブリの一部であります。 Visual Studio で NuGet 拡張をインストールにより、ライブラリ パッケージ マネージャー、EntityFramework.dll への参照をプロジェクトに追加することができます。 図 1 Visual Studio ライブラリ パッケージ マネージャーで EntityFramework パッケージ (現在、最も人気のあるダウンロード NuGet パッケージ ライブラリ) を示します。

Installing Code First and DbContext into a Project via EntityFramework.dll
図 1 のコードを最初にインストールして EntityFramework.dll を介してプロジェクト DbContext

続きを読むことができますなぜ、特定の種類の外部の機能を展開するための NuGet の使用に集中することを決めたのエンティティ フレームワークの機能の解放のためのチームの計画については。NET Api は 2011年 10 月ブログ記事で、どのように我々 の話について EF とその将来「バージョン」(bit.ly/owoWgn)。

関連するデータを含めるにフィルターを適用できますか?

第 Include メソッドを熱心に、エンティティ データ モデルに対するクエリの実行時関連データをロードすることができます。 残念ながら、関連のデータの一括読み込みの唯一の完全なセットを取得することができます。 これも遅延読み込みは、明示的な読み込みのすべてが 1 つの場合は、true です。 その 1 つの場合:変更トラッカーを API を明示的に読み込むときが、クエリ メソッドを適用できるフィルターします。

context.Entry(personInstance)
  .Collection(p => p.Aliases)
  .Query()
  .Where(a=>a.FirstName == "Natasha")
  .Load();

しかし、明確にするためには、イーガーローディングを含めるをすることはできません。

これはどのように含めるエンティティ フレームワークでの最初のリリース以来働いてです。ネット フレームワーク 3.5。 フィルタ リングの一括読み込みを結合する場合は、投影を使用を検討してください。 続きを読むことができます 2011 年 6 月データ ポイント列は「Demystifying エンティティ フレームワーク戦略。関連データを読み込み中に" msdn.microsoft.com/magazine/hh205756。 私はまたで」使用予測と、リポジトリに偽のフィルター熱心な負荷、」のトピックのブログの記事を書いている bit.ly/uZdnxy

含めるとラムダを使用する方法をか。

ObjectContext を含めるを使用する唯一の方法で熱心にロードするには、ナビゲーション プロパティを表す文字列を渡すことです。 たとえば、ICollection <Tree> は、プロパティの木が道路のクラスがある場合の道路の木このようなクエリと。

context.Roads.Include("Trees")

多くの開発者は、厳密な型の式を代わりに使用を許可するように独自の拡張メソッドを作成しました。

context.Roads.Include(r => r.Trees)

含むラムダ式を使用する、機能は、今、DbContext API に組み込まれています。 その 6 のアーサー ビッカースの素晴らしい 12 部ブログ シリーズ DbContext API についての例を見つけること (bit.ly/wgI5zW)。 この機能を使用しよう、ただし成功たろう — 私あった。 私は自分のエゴを脇に置くし、ラムダ サポートを得る方法でチームを尋ねるならなかったと思う。 EntityFramework.dll への参照に加えにを使用して、必要がある結局 System.Data.Entity 場所をしている、ラムダを含むを使用する、コード ファイル内のディレクティブだ (または Visual basic の輸入)。 ラムダを使用してリレーションシップの複数のレベルのコレクションのイーガーローディングを展開する場合は、余分な選択方法を組み込む必要があります。 たとえば、ツリー クラスが ICollection <Leaf> が 熱望する木と葉を読み込み、文字列表現がこのようになります。

context.Roads.Include("Trees.Leaves")

ただし、ラムダの関係の次のレベルを提供するために追加のロジックに依存します。 樹木とその葉と共に道路を使用の構文です。

context.Roads.Include(r => r.Trees.Select(t => t.Leaves))

熱心にしようとすると、関係を SQL クエリになることができます含めるより複雑な劣化負荷アラームを追加することがなく複数のレベルを含めるを使用してについて話をすることはできません。 常にエンティティ フレームワーク (EF) によって生成される SQL をプロファイリング勧めします。 実際には、2010 年 12 月データ ポイント列 EF を使用する場合、データベースをプロファイルするさまざまな方法を示します。

私は ObjectContext API を使用している場合は、EntityFramework.dll ディレクティブを使用して、System.Data.Entity への参照、ラムダを含む、使用することもできることを学ぶに驚いた。

待つは。NET Framework コードまず Ado.net データ サービスを使用する場合の 4.5 ですか?

作成と Ado.net データ サービスでの使用の 2 つのアセンブリがあります。NET Framework 4:System.Data.Services.dll と System.Data.Services.Client.dll。 これらの DbContext とコードの最初のクラスを使用する場合は、ボックスのうち動作しません。 問題は DbContext で、最初のコードのないです。 これらのアセンブリがビルドされたときに、彼らはそれを理解していないので DbContext が存在していません。 2011 年 3 月には、Microsoft と DbContext を使用する方法を知っている修正アセンブリ (Microsoft.Data.Services.dll と Microsoft.Data.Services.Client.dll) に含まれている Community Technology Preview (CTP) リリース。 だから、すべてを行うことですこれら新しいアセンブリと、あなたのデータ サービスで、既定のアセンブリを置換 DataServiceProtocolVersion V2 ではなく V3 を指定します。 ここでの単純なデータ サービスからの DbContext を継承、コンテキスト (PersonModelContext) を公開するような例です。

public class DataService : DataService<PersonModelContext>
  {
    public static void InitializeService(DataServiceConfiguration config)
    {
      config.SetEntitySetAccessRule("People", EntitySetRights.All);
      config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
}

このソリューションの問題の新しいアセンブリのみ Ctp ですと製造用。 データを運用環境で使用できるようにするサービスの製造 (RTM) に次のリリースを待つ必要があります。

しかし、それは DbContext を使用することが可能です。ネット フレームワーク 4 System.Data.Services のアセンブリ。 CTP アセンブリだけ余分なコードを書くを避けるために存在します。 すべてを行う必要があるアクセス、DbContext をサポートしている、基になる ObjectContext とは、サービスの提供します。 2010 年 7 月ナナカマド ミラー、コード最初の背後に Microsoft で重要なプレーヤーは、このブログの記事を示した「EF CTP4 のヒント & トリック:WCF データ サービス DbContext」(bit.ly/c2EA0l)。 DbContext 内のクラスの PersonModelContext、1 つの DbSet、人のクラスを公開する単純なモデルを使用してエンティティ フレームワーク 4.2 バージョンで動作するように彼の例を更新しましたので、ブログ、DbContext の早期プレビューに書かれています。 図 2 では、クラスのコンテキストに表示されます。

図 2 シンプルな DbContext とは、データ サービスによって使用されるクラス

public class PersonModelContext : DbContext
{
  public DbSet<Person> People { get; set; }
}
public class Person
{
  public int PersonId { get; set; }
  [MaxLength(10)]
  public string IdentityCardNumber { get; set; }
  public string FirstName { get; set; }
  [Required]
  public string LastName { get; set; }
}

データ サービスは、DbContext から派生した PersonModelContext 具体的ではなく、ObjectContext を動作するように定義されます。 次に、データをオーバーライドすることによって CreateData サービス­ソース メソッドを図 3 に示すように、サービスに必要な ObjectContext により、PersonModelContext の基になる、ObjectContext を公開することができます。

図 3 WCF のデータは、DbContext を使用してサービス。NET Framework 4 サービス Api

public class DataService : DataService<ObjectContext>
{
  public static void InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("People", EntitySetRights.All);
    config.DataServiceBehavior.MaxProtocolVersion =
      DataServiceProtocolVersion.V2;
  }
  protected override ObjectContext CreateDataSource()
  {
    var dbContext = new PersonModelContext();
    var oContext = ((IObjectContextAdapter)dbContext).ObjectContext;
    return oContext;
  }
}

これは、ObjectContext を提供することに集中したいのですが。 ため、Ado.net データ サービスで必要があります、コードの簡単なビューです。

このアプローチの欠点は DbContext 機能の検証などを使用することができないということです (私の 2011 年 12 月データ ポイントのコラムで、「処理エンティティ フレームワーク検証で WCF データ サービス」で説明されているよう msdn.microsoft.com/magazine/hh580732) サービス ObjectContext を動作するように設計されているため。

データ注釈または流暢な API をコード最初設定を使用する必要がありますか?

この質問は多くの質問を取得します。 答えを理解するには、まずこれら 2 つのオプションの高レベルの違いを理解すると便利です。

コード最初拡張データ注釈は既にの一部は。ネット フレームワーク 4 System.ComponentModel.DataAnnotations 名前空間。 ValidationAttributes などのアノテーションに加え (必須、絃長、RegEx)、Entity Framework データベース マッピング (たとえば、列、表、タイムスタンプ) または ComplexType など他モデルに固有の機能を指定する属性を追加します。 人クラス図 2 で示すようにアノテーションはクラスを適用する簡単です。

これにはデータ注釈を使用して、クラスのコードの最初の構成するいくつかの可能な欠点があります。 1 つは、永続化関連ロジックをビジネス クラスに追加のファンされないことです。 自分を求めている場合は、「何、データベース列の名前私のドメイン モデルとはしては?」、データ注釈を使用するたくないです。 別のこれらのマッピング、EntityFramework.dll への参照、ビジネス クラスを含むアセンブリから必要です。 (これの変更。EF 関連データ注釈の所有権を取得するネット フレームワーク 4.5。)あまりにも、何か特に階層にわたって、アプリケーションを配布している場合は、たいかもしれません。 また、コードの最初のデータ注釈コード最初を使用して適用することができます構成の完全なラインナップを公開しません。 いくつかの構成は、たとえば特定の詳細については、階層ごとのテーブル (TPH) のマッピングを指定するは、のみ、流暢な API を使用して実現できます。

私の推薦の開発者にあなたのようなスタイルを選択することです。 エンティティ フレームワーク DbContext での表現を構成する場合は、新しい API を使用します。 属性の適用のシンプルさのようなクラスのコード最初のマッピングのロジックのことを気にしない場合は、データ注釈を使用します。 データ注釈を使用して表現できる構成間で来ることを選択した場合、流暢な API でのみ構成流暢追加し、データ注釈と流暢な構成の組み合わせを使用します。

最初、既存のデータベースではコードを使用できますか。

絶対に ! コードの最初の既定の動作 (親切) データベースを作成するが、既存のデータベースに接続文字列をポイントし、コードを使用して最初ができます。 コードは、同様のデータベースをプログラムで指定できる最初のいくつかの内部機能です。 たとえば、データベース名またはデータベース接続文字列を DbContext コンストラクタをオーバー ロードすることができます。 また、指定しても DbContext ConnectionFactory 型 (SqlConnectionFactory) などをカスタマイズできます。

コードの最初の規則と正確に追加したすべての設定を既存のデータベースにあなたのクラスをマップする方法を表すことを確認する必要があります。 Microsoft データベースをリバース エンジニア リングにクラスに加え、素晴らしいスタートを提供することができますコード最初の流暢な構成にすることができますツールに取り組んでいます。 このツールで私 2011 年 5 月のブログの記事、「クイック検索で逆エンジニア DB にコード最初クラス」について詳細を学ぶことができます (bit.ly/lHJ2Or).

場所を指定する場合は、スキーマの検証、DbContext デフォルト コード最初ではデータベースの初期化を避けてください。 完全にこの機能を使ってコードの最初のデータベースの初期化を無効にすることができます。

Database.SetInitializer<MyContext>(null)

詳細については、MSDN データ デベロッパー センター記事、ビデオ、」データベース初期化子エンティティ フレームワーク 4.1 で「見つける (msdn.microsoft.com/data/hh272552). ConnectionFactory クラスと DbContext のオーバー ロードの作業の詳細な例については、チェック アウトすることが必ず「プログラミング エンティティ フレームワーク。最初のコード」(オライリー メディア、2011年)、私は、コードの最初のチームからナナカマド ミラーと共著本。

その他のリソース

コードの最初と DbContext の操作についての多くの場所です。 Entity Framework チーム ブログで blogs.msdn.com/adonet ウォークスルーと例でいっぱいです。 いくつかのチームのメンバーのブログ、ナナカマド ミラーなど (romiller.com) とアーサー ビッカース圧痕 (blog.oneunicorn.com/author/ajcvickers) を読むのに素晴らしい場所、上級テクニックです。 MSDN フォーラムや StackOverflow.com のスレッドを読むまたはあなた自身の質問をする絶好の場所であり続けます。 ミラーと私は最近、前述の 2 短い本を書いた"プログラミングのエンティティ フレームワーク。最初のコード」および「Entity Framework のプログラミング。DbContext」(オライリー メディア、2012年)。 印刷やデジタル形式でこれらを得ることができます。

物事を自分でしようと奮闘する必要はありません。

Julie Lerman*、Microsoft MVP であります。ネットのメンターとバーモント州の丘に住むコンサルタント。 データ アクセスおよび他の Microsoft の彼女の提示を見つけることができます。ユーザー グループと、世界中のカンファレンスでのネットのトピック。彼女のブログで thedatafarm.com/blog 、「Entity Framework のプログラミング」の著者 (2010 年)、「プログラミングのエンティティ フレームワーク。最初のコード」(2011 年)、両方の米オライリー メディア社から。彼女に Twitter に続く twitter.com/julielerman。*

この記事のレビュー、次技術専門家に感謝:Mike FlaskoDiego Vega