DbContext の操作Working with DbContext

Entity Framework を使用して .NET オブジェクトを使用してデータのクエリ、挿入、更新、および削除を行うには、まず、モデルで定義されているエンティティとリレーションシップをデータベース内のテーブルにマップする モデルを作成 する必要があります。In order to use Entity Framework to query, insert, update, and delete data using .NET objects, you first need to Create a Model which maps the entities and relationships that are defined in your model to tables in a database.

モデルを作成すると、アプリケーションが対話するプライマリクラスは System.Data.Entity.DbContext (多くの場合、コンテキストクラスと呼ばれます) になります。Once you have a model, the primary class your application interacts with is System.Data.Entity.DbContext (often referred to as the context class). モデルに関連付けられている DbContext を使用して、次のことを行うことができます。You can use a DbContext associated to a model to:

  • クエリの作成と実行Write and execute queries
  • クエリ結果をエンティティオブジェクトとして具体化するMaterialize query results as entity objects
  • これらのオブジェクトに加えられた変更を追跡するTrack changes that are made to those objects
  • オブジェクトの変更をデータベースに保存するPersist object changes back on the database
  • メモリ内のオブジェクトを UI コントロールにバインドするBind objects in memory to UI controls

このページでは、コンテキストクラスを管理する方法に関するガイダンスを示します。This page gives some guidance on how to manage the context class.

DbContext 派生クラスの定義Defining a DbContext derived class

コンテキストを使用する場合は、DbContext から派生するクラスを定義し、コンテキスト内の指定されたエンティティのコレクションを表す Dbcontext プロパティを公開することをお勧めします。The recommended way to work with context is to define a class that derives from DbContext and exposes DbSet properties that represent collections of the specified entities in the context. EF デザイナーを使用している場合は、コンテキストが生成されます。If you are working with the EF Designer, the context will be generated for you. Code First を使用する場合は、通常、コンテキストを自分で記述します。If you are working with Code First, you will typically write the context yourself.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

コンテキストを取得した後は、これらのプロパティを使用して、コンテキスト内のエンティティを照会、追加 ( Add またはメソッドを使用 Attach ) または削除 (を使用 Remove ) できます。Once you have a context, you would query for, add (using Add or Attach methods ) or remove (using Remove) entities in the context through these properties. コンテキストオブジェクトのプロパティへのアクセスは、 DbSet 指定された型のすべてのエンティティを返す開始クエリを表します。Accessing a DbSet property on a context object represent a starting query that returns all entities of the specified type. プロパティにアクセスするだけではクエリが実行されないことに注意してください。Note that just accessing a property will not execute the query. クエリは次の場合に実行されます。A query is executed when:

  • foreach (C#) または For Each (Visual Basic) ステートメントによって列挙された場合。It is enumerated by a foreach (C#) or For Each (Visual Basic) statement.
  • これは、、、などのコレクション操作によって列挙され ToArray ToDictionary ToList ます。It is enumerated by a collection operation such as ToArray, ToDictionary, or ToList.
  • やなどの LINQ First 演算子 Any は、クエリの最も外側の部分で指定されます。LINQ operators such as First or Any are specified in the outermost part of the query.
  • 次のいずれかのメソッドが呼び出されます。 Load DbEntityEntry.Reload Database.ExecuteSqlCommand DbSet<T>.Find 指定したキーを持つエンティティがコンテキストに既に読み込まれていない場合は、拡張メソッド、、、および。One of the following methods are called: the Load extension method, DbEntityEntry.Reload, Database.ExecuteSqlCommand, and DbSet<T>.Find, if an entity with the specified key is not found already loaded in the context.

有効期間Lifetime

コンテキストの有効期間は、インスタンスが作成されると開始され、インスタンスが破棄またはガベージコレクトされるときに終了します。The lifetime of the context begins when the instance is created and ends when the instance is either disposed or garbage-collected. コンテキストで制御されるすべてのリソースをブロックの最後に破棄する場合は、 使用します。Use using if you want all the resources that the context controls to be disposed at the end of the block. 使用すると、コンパイラは自動的に try/finally ブロックを作成し、 finallyブロックで dispose を呼び出します。When you use using, the compiler automatically creates a try/finally block and calls dispose in the finally block.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

コンテキストの有効期間を決定するときの一般的なガイドラインを次に示します。Here are some general guidelines when deciding on the lifetime of the context:

  • Web アプリケーションを操作する場合は、要求ごとにコンテキストインスタンスを使用します。When working with Web applications, use a context instance per request.
  • Windows Presentation Foundation (WPF) または Windows フォームを使用する場合は、フォームごとにコンテキストインスタンスを使用します。When working with Windows Presentation Foundation (WPF) or Windows Forms, use a context instance per form. これにより、コンテキストによって提供される変更追跡機能を使用できます。This lets you use change-tracking functionality that context provides.
  • コンテキストインスタンスが依存関係挿入コンテナーによって作成されている場合、通常、コンテキストを破棄するのはコンテナーの役割です。If the context instance is created by a dependency injection container, it is usually the responsibility of the container to dispose the context.
  • コンテキストがアプリケーションコードで作成されている場合は、不要になったときにコンテキストを破棄することを忘れないでください。If the context is created in application code, remember to dispose of the context when it is no longer required.
  • 実行時間の長いコンテキストを使用する場合は、次の点を考慮してください。When working with long-running context consider the following:
    • オブジェクトとその参照をメモリに読み込むと、コンテキストのメモリ消費量が急速に増加する可能性があります。As you load more objects and their references into memory, the memory consumption of the context may increase rapidly. これは、パフォーマンスを低下させる原因になります。This may cause performance issues.
    • コンテキストはスレッドセーフではないため、同時に処理を行う複数のスレッド間で共有することはできません。The context is not thread-safe, therefore it should not be shared across multiple threads doing work on it concurrently.
    • 例外によってコンテキストが回復不能な状態になると、アプリケーション全体が終了する可能性があります。If an exception causes the context to be in an unrecoverable state, the whole application may terminate.
    • データの照会時と更新時の時間差が大きくなると、コンカレンシーに関する問題が生じる可能性が高くなります。The chances of running into concurrency-related issues increase as the gap between the time when the data is queried and updated grows.

接続Connections

既定では、コンテキストはデータベースへの接続を管理します。By default, the context manages connections to the database. コンテキストが開き、必要に応じて接続が閉じられます。The context opens and closes connections as needed. たとえば、コンテキストは、クエリを実行するための接続を開き、すべての結果セットが処理されたときに接続を閉じます。For example, the context opens a connection to execute a query, and then closes the connection when all the result sets have been processed.

接続の開閉をより詳細に制御する必要がある場合もあります。There are cases when you want to have more control over when the connection opens and closes. たとえば、SQL Server Compact を使用する場合、パフォーマンスを向上させるために、アプリケーションの有効期間中、データベースに対して開いている接続を個別に維持することをお勧めします。For example, when working with SQL Server Compact, it is often recommended to maintain a separate open connection to the database for the lifetime of the application to improve performance. Connection プロパティを使用することにより、手動でこのプロセスを管理できます。You can manage this process manually by using the Connection property.