Skip to content

MS_EntityFrameworkCore

nishi_74322014 edited this page Aug 18, 2026 · 1 revision

Entity Framework Core

概要

Entity Framework(EF6)を、
.NET Core向けに作り直した O/R マッパ。

移行メモ(元ページの状態): 元ページは目次と空の「概要」「参考」節のみの
スタブ ページである。
移行に際して、ページの位置付けを保ったまま、
EF6 との違いを中心に単独で読める程度の補記を追加した。

補足(EF6 の後継ではあるが移植ではない): EF Core は
EF6 のコードベースを引き継いだものではなく、ゼロから書き直された別実装である。
このため、名前が似ていても以下のように挙動・機能が異なる。

EF6 EF Core
名前空間 System.Data.Entity Microsoft.EntityFrameworkCore
対象 .NET Framework 中心 クロスプラットフォーム
開発 保守のみ(新機能なし) 現行。年次でメジャー更新
EDMX / デザイナ あり なし
開発スタイル モデル / DB / コード ファースト Code First と scaffold
遅延読み込み 既定で有効 既定で無効(プロキシ パッケージが必要)
一括更新・削除 なし ExecuteUpdate / ExecuteDelete(EF Core 7 以降)
多対多 中間エンティティ不要 EF Core 5 以降で不要に
プロバイダ SQL Server 中心 SQL Server / PostgreSQL / SQLite / MySQL / Cosmos DB ほか

詳細

基本的な使い方

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs => Set<Blog>();

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer(connectionString);
}

// Program.cs(ASP.NET Core:DI コンテナに登録)
builder.Services.AddDbContext<BloggingContext>(o =>
    o.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

接続文字列の供給は.NET Core configを参照。

マイグレーション

dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update

既存 DB からのリバース エンジニアリング(Database First 相当)は以下。

dotnet ef dbcontext scaffold "接続文字列" Microsoft.EntityFrameworkCore.SqlServer

補足(本番へのスキーマ適用): dotnet ef database update
本番環境に対して直接実行するのは避け、

dotnet ef migrations script --idempotent --output migrate.sql

で SQL を出力し、レビューしてから適用するのが安全である。

押さえておく落とし穴

論点 内容
N+1 問題 関連を都度ロードすると 1 件ごとにクエリが飛ぶ。Include / ThenInclude でまとめる
IQueryableIEnumerable の境界 ToList() / AsEnumerable() を挟むと以降はメモリ上の処理になる(Entity Framework参照)
DbContext のライフタイム スレッド セーフではない。ASP.NET Core では Scoped(リクエスト単位)が既定
一括処理 行ごとの往復を避け、ExecuteUpdate / ExecuteDeleteSqlBulkCopy を使う(SQL Server 大量データ処理時の性能問題
同時実行制御 rowversion 列 + [Timestamp] で楽観制御(DBMSのロック・分離戦略と同時実行制御
発行 SQL の確認 optionsBuilder.LogTo(Console.WriteLine)。開発時のみ EnableSensitiveDataLogging()

補足(テストで InMemory を使わない): Microsoft.EntityFrameworkCore.InMemory
リレーショナル DB の制約(一意制約、外部キー、トランザクション)を
再現しないため、テストが通っても本番で落ちる
現在は SQLite の in-memory モードか、
Testcontainers で実 DBMS を立てる方式が推奨されている。

参考

関連


Tags: 移行, .NET開発, .NET Core, .NET Standard, データアクセス, ADO.NET, Entity Framework

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally