Entity Framework Core とは

完了

ほとんどの簡単でない Web アプリケーションでは、データに対して作成、読み取り、更新、削除 (CRUD) などの操作を確実に実行する必要があります。 また、アプリケーションが再起動しても、これらの操作によって行われた変更を保持する必要があります。 .NET アプリケーションでデータを永続化するためのさまざまなオプションがありますが、Entity Framework (EF) Core はユーザーフレンドリなソリューションであり、多くの .NET アプリケーションに適しています。

EF Core について

EF Core は、軽量で拡張可能なオープンソースであり、.NET アプリケーション用のクロスプラットフォームのデータ アクセス テクノロジです。

EF Core は、次のようなオブジェクト リレーショナル マッパーとして機能します。

  • .NET 開発者が .NET オブジェクトを使用してデータベースを操作できる。
  • 通常記述しなければならないデータアクセス コードの多くを不要にする。

EF Core は、SQLite、MySQL、PostgreSQL、Oracle、Microsoft SQL Server など、多くの一般的なデータベースをサポートします。

Model

EF Core では、データ アクセスはモデルを利用して実行されます。 モデルはエンティティ クラスと、データベースとのセッションを表すコンテキスト オブジェクトから構成されます。 このコンテキスト オブジェクトにより、データのクエリと保存が可能になります。

エンティティ クラス

このシナリオでは、ピザ ストア管理 API を実装するため、Pizza エンティティ クラスを使用します。 ストアのピザに、名前と説明が設定されます。 また、API とデータベースがそれらを識別するための ID も必要になります。 アプリケーションで使用する Pizza エンティティ クラスによって、ピザが識別されます。

namespace PizzaStore.Models 
{
  public class Pizza
  {
      public int Id { get; set; }
      public string? Name { get; set; }
      public string? Description { get; set; }
  }
}

コンテキスト クラス

このアプリケーションにはエンティティ クラスが 1 つだけ存在しますが、ほとんどのアプリケーションには複数のエンティティ クラスがあります。 コンテキスト クラスは、データのクエリやエンティティ クラスへの保存、およびデータベース接続の作成と管理を担当します。

EF Core を使用して CRUD 操作を実行する

EF Core が構成されたら、それを使用してエンティティ クラスに対して CRUD 操作を実行できます。 その後は C# クラスに対して開発し、データベース操作をコンテキスト クラスに委任できます。 次に、データベース プロバイダーによって、これがデータベース固有のクエリ言語に変換されます。 たとえば、リレーショナル データベースのための SQL です。 クエリは、結果で返されたエンティティがコンテキストに既に存在する場合でも、常にデータベースに対して実行されます。

クエリ データ

コンテキスト オブジェクトは、各エンティティ型のコレクション クラスを公開します。 先ほどの例では、コンテキスト クラスが Pizza オブジェクトのコレクションを Pizzas として公開しています。 コンテキスト クラスのインスタンスが存在するので、データベースに対してすべてのピザについてのクエリを実行できます。

var pizzas = await db.Pizzas.ToListAsync();

データの挿入

同じコンテキスト オブジェクトを使用して、新しいピザを挿入できます。

await db.pizzas.AddAsync(
    new Pizza { ID = 1, Name = "Pepperoni", Description = "The classic pepperoni pizza" });

データの削除

削除操作はシンプルです。 削除する項目の ID のみが必要です。

var pizza = await db.pizzas.FindAsync(id);
if (pizza is null)
{
    //Handle error
}
db.pizzas.Remove(pizza);

データの更新

同様に、既存のピザを更新することもできます。

int id = 1;
var updatepizza = new Pizza { Name = "Pineapple", Description = "Ummmm?" })
var pizza = await db.pizzas.FindAsync(id);
if (pizza is null)
{
    //Handle error
}
pizza.Item = updatepizza.Item;
pizza.IsComplete = updatepizza.IsComplete;
await db.SaveChangesAsync();

EF Core メモリ内データベースを使用する

EF Core には、アプリケーションのテストに使用できるメモリ内データベース プロバイダーが含まれています。 メモリ内データベース プロバイダーはテストと開発に役立ちますが、運用環境では使用しないでください。 次のユニットでは、メモリ内データベース プロバイダーを使用してデータベースを作成し、それに対して CRUD 操作を実行します。