Entity Framework 4でデータベースアクセスをスマートに!DbContextとDataContextを使いこなすテクニック
C#におけるDbContextとDataContextの比較:Entity Framework 4
C#でデータベースアクセスを行う場合、DbContextとDataContextという2つの主要なクラスが利用できます。どちらもEntity Framework 4 (EF4)で導入されましたが、異なる目的と機能を持ちます。
DbContext
- 例:
- 利点:
- オブジェクト指向モデルとデータベース間の密接な統合
- コードの簡潔化と保守性の向上
- LINQによる強力なクエリ機能
- 主な機能:
- エンティティクラス: データベーステーブルと対応するC#クラスを定義します。
- DbSet: エンティティクラスのコレクションを管理します。
- Change Tracking: データベースとの変更を自動的に追跡し、必要な更新を実行します。
- クエリ: LINQ構文を用いてデータベースからデータを効率的に取得します。
using (var context = new MyDbContext())
{
var products = context.Products.Where(p => p.Price > 100).ToList();
foreach (var product in products)
{
Console.WriteLine(product.Name);
}
}
- 利点:
- 軽量でシンプルなAPI
- 低レベルなデータベース操作への直接アクセス
- 主な機能:
- データベース接続の確立と管理
- SQLクエリの実行
- データ操作: データの挿入、更新、削除
using (var context = new DataContext("connection string"))
{
var command = context.CreateCommand("SELECT * FROM Products WHERE Price > 100");
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["Name"]);
}
}
}
比較表
機能 | DbContext | DataContext |
---|---|---|
主な目的 | オブジェクト指向モデルとデータベース間のマッピングと永続化 | データベース接続とデータ操作 |
機能 | エンティティクラス、DbSet、Change Tracking、LINQクエリ | データベース接続、SQLクエリ、データ操作 |
利点 | オブジェクト指向モデルとの密接な統合、コードの簡潔化、LINQクエリ機能 | 軽量でシンプルなAPI、低レベルなデータベース操作への直接アクセス |
適用シナリオ | オブジェクト指向モデルベースのアプリケーション | シンプルなデータアクセス操作 |
- DataContext: 軽量でシンプルなデータアクセス操作が必要な場合に適しています。
- DbContext: オブジェクト指向モデルとデータベース間の密接な統合が必要な場合に適しています。
- より新しいバージョンのEntity Framework (EF Core) では、DbContextのみが使用されます。
- DataContextは、EF6以降でも引き続き使用できますが、非推奨とされています。
- EF4以降では、DbContextが主要なクラスとして推奨されています。
using (var context = new MyDbContext())
{
var products = context.Products.Where(p => p.Price > 100).ToList();
foreach (var product in products)
{
Console.WriteLine(product.Name);
}
}
解説:
using
ブロックを使用して、MyDbContext
インスタンスを作成します。Products
DbSetを使用して、データベースから製品情報のコレクションを取得します。Where
句を使用して、価格が100円を超える製品のみをフィルタリングします。ToList
メソッドを使用して、コレクションをリストに変換します。foreach
ループを使用して、リスト内の各製品について、Name
プロパティの値をコンソールに出力します。
シナリオ: 同じ条件で製品情報を取得し、コンソールに出力します。
using (var context = new DataContext("connection string"))
{
var command = context.CreateCommand("SELECT Name FROM Products WHERE Price > 100");
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["Name"]);
}
}
}
using
ブロックを使用して、connection string
を指定してDataContext
インスタンスを作成します。CreateCommand
メソッドを使用して、SQLクエリを定義します。ExecuteReader
メソッドを実行して、クエリ結果のDataReaderを取得します。Read
メソッドを呼び出して、DataReader内の各レコードを処理します。reader["Name"]
を使用して、現在のレコードのName
列の値を取得し、コンソールに出力します。
- より複雑な操作や、エラー処理などは、それぞれのAPIのドキュメントを参照してください。
- 上記の例はあくまで基本的な使用方法を示したものです。
- Entity Framework Core: Entity Framework 4の後継となる、最新のORMフレームワークです。
- Dapper: 軽量で高速なマイクロORMです。
- NHibernate: オブジェクト指向モデルとデータベース間のマッピングと永続化を行うオープンソースのライブラリです。
- ADO.NET: データベースとの低レベルな通信を提供します。
それぞれの特徴
方法 | 特徴 | 適用シナリオ |
---|---|---|
ADO.NET | 低レベルな制御が可能 | 高度なカスタマイズが必要な場合 |
NHibernate | オブジェクト指向モデルとデータベース間の密接な統合 | エンタープライズアプリケーション |
Dapper | 軽量で高速 | シンプルなデータアクセス操作 |
Entity Framework Core | オブジェクト指向モデルとデータベース間の強力な統合 | 最新の .NET アプリケーション |
- LINQ to SQL: LINQ構文を使用してデータベースにアクセスする機能です。
- OLE DB: さまざまなデータソースへのアクセスを提供するコンポーネントモデルです。
- ODBC: さまざまなデータベースとの接続を可能にする標準規格です。
最適な方法の選択
最適な方法は、プロジェクトの要件によって異なります。
- 最新の .NET アプリケーション: Entity Framework Core
- エンタープライズアプリケーション: NHibernate、Entity Framework Core
- オブジェクト指向モデルとの密接な統合: NHibernate、Entity Framework Core
- シンプルなデータアクセス: ADO.NET、Dapper
c# database entity-framework-4