EF Core について
Entity Framework Core (EF Core) は "オブジェクト リレーショナル マッパー (ORM)" です。 ORM は、コードで実装するドメイン モデルとデータベースの間のレイヤーを提供します。 EF Core はデータ アクセス API であり、.NET の "単純な従来の共通ランタイム言語 (CLR) オブジェクト (POCO)" と厳密に型指定された "統合言語クエリ (LINQ)" 構文を使ってデータベースを操作できます。
EF Core では、データベースは .NET POCO の背後に抽象化されます。 基になるデータベースとの直接的なやり取りは、EF Core によって処理されます。 この API を使うと、データベースとの間でやり取りされる要求の変換や SQL の記述に要する時間を短縮でき、重要なビジネス ロジックに集中する時間を増やすことができます。
EF Core を使うと、次のことができます。
- データを C# オブジェクト (エンティティ) として読み込む。
- エンティティでメソッドを呼び出して、データを追加、変更、削除する。
- 複数のデータベース テーブルを 1 つの C# エンティティにマップする。
- 複数のユーザーが同じレコードを同時に更新しようとしたときに発生するコンカレンシーの問題を処理する。
- LINQ (System.Linq) 構文を使ってデータベースに対してクエリを実行する。
- SQL Server、SQLite、Azure Cosmos DB、PostgreSQL、MySQL などの複数のデータベースにアクセスする。
- 既存のデータベースからドメイン モデルを構築する。
- ドメイン モデルに基づいてデータベース スキーマを管理する。
- 関連するエンティティの複雑な、深い、または広いオブジェクト グラフに対する変更を、1 回のメソッド呼び出しを使ってコミットする。
EF Core のアーキテクチャを確認する
次の図は、EF Core のアーキテクチャを示したものです。
DbContext は、処理の単位を表す特別なクラスです。 DbContext
で提供されるメソッドを使うと、オプション、接続文字列、ログ、ドメインをデータベースにマップするために使われるモデルを構成できます。
DbContext
から派生するクラス:
- データベースとのアクティブなセッションを表します。
- エンティティのインスタンスを保存してクエリを実行します。
- データベース内のテーブルを表す
DbSet<T>
型のプロパティを含めます。
EF Core プロバイダーによって、オブジェクト グラフの変更が SQL に変換されます。
データベース プロバイダー:
- SQL Server、Azure Cosmos DB、PostgreSQL など、特定のデータベース エンジン用に設計されたプラグイン ライブラリです。
- メソッド呼び出しと LINQ クエリを、データベースのネイティブな SQL 言語に変換します。
- データベース エンジンに一意の機能を有効にするために EF Core を拡張します。
データベース スキーマを管理する
EF Core には、EF Core モデルとデータベース スキーマを同期させる主要な方法が 2 つ用意されています。
- 移行 (信頼できる情報源として "モデル" を使用)
- リバース エンジニアリング (信頼できる情報源として "データベース" を使用)
これらのオプションを選ぶには、EF Core とデータベース スキーマのどちらが "信頼できる情報源" か判断します。
移行
実際のプロジェクトでは、アプリの機能が実装されるときに、データ モデルが変更されます。 新しいエンティティが追加および削除されたら、それに応じてデータベース スキーマを変更する必要があります。 EF Core の移行機能では、データベースの既存のデータを維持しながら、アプリケーションのデータ モデルとデータベース スキーマを同期した状態で、データベース スキーマを増分的に更新することができます。
データ モデルを変更したら、開発者は EF Core のツールを使用して対応する移行を追加します。 EF Core により現在のモデルと以前のモデルのスナップショットが比較されて、違いが特定されます。 変更を実装するための C# コードが生成されます。 カスタム動作やデータのシードを行うために、その C# ファイルに変更を加えることができます。 ファイルは、他のソース ファイルと同様にプロジェクトのソース管理で追跡されます。
新しい移行が生成されたら、それをさまざまな方法でデータベースに適用できます。 適用されたすべての移行は、EF Core によって特別な履歴テーブルに記録されます。 履歴テーブルには、どの移行が適用されたかについての記録が保持されます。
リバース エンジニアリング
リバース エンジニアリングは、データベース スキーマに基づいてエンティティ モデル クラスと DbContext
クラスをスキャフォールディングするプロセスです。 この方法は、データベース管理者によって管理される既存または共有のデータベースでよく使われます。
次のユニットでは、移行を使って EF Core の使用を開始します。