Entity Framework Core

Entity Framework (EF) Core は人気の Entity Framework データ アクセス テクノロジの軽量版であり、拡張性に優れ、オープン ソースで、プラットフォームに依存しません。

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

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

EF Core は多くのデータベース エンジンに対応しています。詳細については、「Database Providers」(データベース プロバイダー) を参照してください。

モデル

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

EF は、次のモデル開発アプローチをサポートしています。

  • 既存のデータベースからモデルを生成する。
  • データベースに合わせてモデルのコードを手動で書く。
  • モデルが作成されたら、EF の移行 を使用して、モデルからデータベースを作成します。 移行により、モデルの変更に応じてデータベースを進化させることができます。
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace Intro;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public int Rating { get; set; }
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

クエリ実行

エンティティ クラスのインスタンスは、統合言語クエリ (LINQ) を利用し、データベースから取得されます。 詳しくは、「データのクエリ」をご覧ください。

using (var db = new BloggingContext())
{
    var blogs = db.Blogs
        .Where(b => b.Rating > 3)
        .OrderBy(b => b.Url)
        .ToList();
}

データの保存

データはエンティティ クラスのインスタンスを利用し、データベース内で作成、削除、変更されます。 詳細については、「Saving Data」 (データの保存) を参照してください。

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Add(blog);
    db.SaveChanges();
}

EF O/RM の考慮事項

EF Core は多くのプログラミングの詳細を抽象化するのに適していますが、運用アプリでよくある落とし穴を回避するために、どの O/RM にも適用できるいくつかのベスト プラクティスがあります。

  • 高パフォーマンスの運用アプリでデータを設計、デバッグ、プロファイル、移行するには、基になるデータベース サーバーの中級レベル以上の知識が不可欠です。 たとえば、主キーと外部キー、制約、インデックス、正規化、DML および DDL のステートメント、データ型、プロファイルなどの知識です。
  • 機能と統合のテスト: 運用環境は、できるだけ次が行われるようにレプリケートすることが重要です。
    • 特定のバージョンまたはエディションのデータベース サーバーを使用している場合にのみ表示される、アプリのイシューを検索する。
    • EF Core およびその他の依存関係をアップグレードするときに、破壊的変更をキャッチする。 たとえば、ASP.NET Core、OData、AutoMapper などのフレームワークの追加またはアップグレードです。 これらの依存関係は、予期しない形で EF Core に影響を与える可能性があります。
  • 代表的な負荷によるパフォーマンスとストレス テスト。 一部の機能は、そのまま使用しても、あまりスケーリングされません。 たとえば、複数コレクションのインクルード、遅延読み込みの頻繁な使用、非インデックス列に対する条件付きのクエリ、ストアで生成された値を使用した大規模な更新と挿入、コンカレンシー処理の欠如、大規模なモデル、不適切なキャッシュ ポリシーなどです。
  • セキュリティレビュー: たとえば、接続文字列やその他のシークレットの処理、デプロイ操作以外でのデータベースのアクセス許可、生 SQL の入力検証、機密データの暗号化などがあります。
  • ログと診断が十分であり、使用可能であることを確認します。 たとえば、適切なログ構成、クエリ タグ、Application Insights などです。
  • エラー回復。 バージョンのロールバック、サーバーのフォールバック、スケールアウトと負荷分散、DoS の軽減、データ バックアップなど、一般的なエラーのシナリオの緊急時に対する準備を行います。
  • アプリケーションの配置と移行。 配置中に移行がどのように適用されるかを計画します。これをアプリケーションの起動時に実行すると、コンカレンシーのイシューが発生し、通常の操作に必要なものより高いアクセス許可が必要になります。 ステージングを使用して、移行中の致命的なエラーからの回復を容易にします。 詳しくは、「移行の適用」をご覧ください。
  • 生成された移行の詳細な調査とテスト。 移行は、運用データに適用する前に十分にテストする必要があります。 テーブルに運用データが格納されると、スキーマの構造と列の型を簡単に変更することはできません。 たとえば、SQL Server では、nvarchar(max)decimal(18, 2) が文字列と 10 進数のプロパティにマップされた列に最適な型になることはまれですが、EF では特定のシナリオについての知識がないために、既定値として使用されます。

次のステップ

入門チュートリアルについては、「Entity Framework Core の概要」を参照してください。