-
Notifications
You must be signed in to change notification settings - Fork 0
MS_EntityFrameworkCore
- 戻る(Entity Framework)
- Entity Framework Core
Entity Framework(EF6)を、
.NET Core向けに作り直した O/R マッパ。
移行メモ(元ページの状態): 元ページは目次と空の「概要」「参考」節のみの
スタブ ページである。
移行に際して、ページの位置付けを保ったまま、
EF6 との違いを中心に単独で読める程度の補記を追加した。
補足(EF6 の後継ではあるが移植ではない): EF Core は
EF6 のコードベースを引き継いだものではなく、ゼロから書き直された別実装である。
このため、名前が似ていても以下のように挙動・機能が異なる。
EF6 EF Core 名前空間 System.Data.EntityMicrosoft.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 でまとめる |
IQueryable と IEnumerable の境界 |
ToList() / AsEnumerable() を挟むと以降はメモリ上の処理になる(Entity Framework参照) |
DbContext のライフタイム |
スレッド セーフではない。ASP.NET Core では Scoped(リクエスト単位)が既定 |
| 一括処理 | 行ごとの往復を避け、ExecuteUpdate / ExecuteDelete か SqlBulkCopy を使う(SQL Server 大量データ処理時の性能問題) |
| 同時実行制御 |
rowversion 列 + [Timestamp] で楽観制御(DBMSのロック・分離戦略と同時実行制御) |
| 発行 SQL の確認 |
optionsBuilder.LogTo(Console.WriteLine)。開発時のみ EnableSensitiveDataLogging()
|
補足(テストで
InMemoryを使わない):Microsoft.EntityFrameworkCore.InMemoryは
リレーショナル DB の制約(一意制約、外部キー、トランザクション)を
再現しないため、テストが通っても本番で落ちる。
現在は SQLite の in-memory モードか、
Testcontainers で実 DBMS を立てる方式が推奨されている。
- Entity Framework Core | Microsoft Learn
https://learn.microsoft.com/ja-jp/ef/core/ - EF Core と EF6 の比較
https://learn.microsoft.com/ja-jp/ef/efcore-and-ef6/ - EF Core のリリースと計画
https://learn.microsoft.com/ja-jp/ef/core/what-is-new/
Tags: 移行, .NET開発, .NET Core, .NET Standard, データアクセス, ADO.NET, Entity Framework
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。