EF Core 11 チートシート
EF Core 11 で覚えておく価値のある部分。
このサイトでは、AI エージェントの Walter を調査、執筆、保守に使用しています。 制作と検証の方法
このまとめは EF Core 11 について私が書いた記事の生きた索引です。新しいクエリ機能、DiskANN インデックスによるベクトル検索、パフォーマンスの改善、EF Core 8、9、10 からのマイグレーションメモをカバーしています。
まず読むべき記事
すでに EF Core を知っていて差分だけ見たい場合は、“ef core 11” タグの記事を流し読みしてください。マイグレーションを計画している場合は、migration タグの記事に破壊的変更と、私が実際に使った dotnet ef コマンドが載っています。
このページについて
下のリストは、ef core、efcore、entity framework、ef core 11、efcore 11 のいずれかのタグが付いた記事を自動的に集めたものです。新しい順に並びます。
インデックス (105 件)
2026 / 10
- 修正: EF Core で The property 'X' is part of a key and so cannot be modified or marked as modified が発生する
EF Core は追跡中のエンティティのキー値を更新しません。DTO からのキーのコピーをやめ、代替キーの代わりに一意インデックスを使い、本当にキーを変える場合は新しい行を挿入して古い行を削除します。EF Core 10.0.14 で検証しています。
- 1つの EF Core プロジェクトで複数の DbContext ごとにマイグレーションフォルダーを分ける方法
DbContext ごとに --output-dir を一度だけ指定すれば、以降のマイグレーションは同じフォルダーと名前空間に作成されます。既定のレイアウトが偏る理由、共有フォルダーで発生する CS0111 の衝突、既存マイグレーションの移動方法、履歴テーブルを分けるべきタイミングを解説します。
- EF Core で自己参照の多対多リレーションシップ (フォロワー/フォロー中) を構成する方法
EF Core 11 で単一の User エンティティにフォロワーとフォロー中をモデル化します。規約が何を生成するか、SQL Server が結合テーブルの外部キーの片方を黙って ClientCascade に変える理由、タイムスタンプ付きの明示的な Follow 結合エンティティのマッピング方法、そしてエラー 547 や 1785 を出さずにユーザーを削除する方法を解説します。
- EF Core が SQL Server の `date` 列を `DateOnly` と `DateTime` のどちらでスキャフォールドするかは何で決まるのか
決め手はスタートアッププロジェクトにある SQL Server プロバイダーの EF Core バージョンです。EF Core 7 以前は date を DateTime に、EF Core 8 から 11 までは DateOnly にスキャフォールドします。この判断を行う型マッピング、EF Core 7、8、10、11 RC 2 での実測出力、そして列を黙って datetime2 に再マッピングすることなく DateTime に戻す 2 つの方法を紹介します。
- 修正: Pomelo.EntityFrameworkCore.MySql と EF Core 10 の間で発生する NU1608 / NU1107 バージョン競合
Pomelo 9.0.0 は EF Core Relational 9.0.x しか許可しておらず、EF Core 10 向けのビルドもありません。EF Core のパッケージをすべて 9.0.x にそろえるか、Microting.EntityFrameworkCore.MySql 10.0.x に切り替えてください。警告を抑制すると起動時にクラッシュします。
- 修正: Settings file 'DotnetToolSettings.xml' was not found in the package
ツールパッケージがインストールを実行している SDK よりも新しい .NET を対象としているか、そもそも .NET ツールではありません。新しい SDK を使うか、互換性のある tools フォルダーを持つツールのバージョンを固定するか、--framework を強制してください。
- EF Core でエンティティを Attach する前に、DbContext がすでに追跡しているか確認する方法
DbSet.Local.FindEntry(key) を使えば、データベースへの往復やスキャンなしで、指定したキーのエンティティが追跡されているかを変更トラッカーに問い合わせられます。この確認で Entry(entity).State が当てにならない理由、Find がクエリを発行する理由、EF Core 10 で検証済みの AttachOrMerge ヘルパーを紹介します。
- EF Core 11 のコンパイル済みモデルとは何か、有効にする価値があるのはどんなときか
コンパイル済みモデルとは、OnModelCreating を実行せずに EF Core のモデルを再構築する生成済み C# コードです。EF Core 11 RC1 での実測では、500 エンティティでモデルの読み込みが 714 ms から 215 ms に短縮されます。ただし EFOptimizeContext の後継である MSBuild 経由の方法は遅く、古くなったモデルはエラーなしで使われ続け、クエリフィルターがあると生成そのものができません。
- EF Core 11 の shadow プロパティとは何か、なぜマイグレーションに現れたのか
shadow プロパティは、対応する CLR プロパティがないまま EF Core が追跡する列です。EF Core 11 がそれを作る理由 (FK プロパティの欠落、FK の命名ミス、型の不一致、リレーションシップの二重構成)、マイグレーションで BlogId1 のような列を見つける方法、原因ごとの修正方法、そして意図的に shadow プロパティを使う方法を解説します。
- EF Core のクエリを並列実行するための AddDbContextPool と AddDbContextFactory の比較
AddDbContextPool は DI スコープごとに 1 つのスコープ付き DbContext を渡すため、2 つのクエリを同時に実行できません。AddDbContextFactory と AddPooledDbContextFactory は呼び出しごとにコンテキストを返すので、並列クエリに向いています。EF Core 11 RC 1 での計測では、プール付きファクトリはコンテキストを 342 ns、40 B で作成しますが、プールなしでは 17 us、44 KB かかります。
- 修正: EF Core でスカラー結果に SqlQueryRaw<T> を使うと発生する Invalid column name 'Value'
EF Core は、First、Where、Max、Single を追加した時点で、スカラーの SqlQuery<T> をサブクエリでラップし、Value という名前の列を選択します。SQL の列に AS Value のエイリアスを付けるか、先にマテリアライズしてください。
- 解決: EF Core のマイグレーションをリセットした後の There is already an object named 'X' in the database
Migrations フォルダーを削除して新しい InitialCreate を生成すると、EF Core はテーブルが既に存在することを知りません。開発用データベースを削除するか、新しいマイグレーションを実行せずに __EFMigrationsHistory に記録します。
- Npgsql を使う EF Core の全接続に search_path や statement_timeout などの PostgreSQL セッションパラメーターを設定する方法
一度だけ実行した SET は、Npgsql が接続をプールに戻した瞬間に DISCARD ALL で消去されます。Search Path と Options の接続文字列キーワードで search_path と statement_timeout をスタートアップパケットに含め、うまくいかない場合は ALTER ROLE か ConnectionOpened インターセプターにフォールバックします。また、UsePhysicalConnectionInitializer の SET が黙って失われる理由も解説します。
- EF Core 11 クエリにおける EF.Parameter と EF.Constant の違い
EF.Constant はキャプチャした値を SQL リテラルとして埋め込み、EF.Parameter はリテラルを SQL パラメーターに変換します。基本は EF Core の既定のままにし、動的に組み立てた式ツリーが呼び出しのたびに再コンパイルされるのを防ぐには EF.Parameter を使います。EF.Constant は、値の種類が少なく、データの偏りが大きくて値ごとに別のプランが必要な場合だけに使います。
2026 / 09
- 修正: static readonly の `IList<T>` または `ISet<T>` に対する EF Core の `Contains` を変換できない
EF Core 8、9、10 では、リストが IList、ICollection、ISet、IReadOnlySet 型の static readonly フィールドの場合、Contains を変換できません。Enumerable.Contains を明示的に呼び出すか、EF Core 11 にアップグレードしてください。
- EF Core 11 で JSON にマッピングされたプロパティに一意インデックスを追加する方法 (SQL Server と SQLite)
EF Core 11 RC 1 では、ToJson() メンバーに対する HasIndex(...).IsUnique() は一意性を強制しません。SQL Server は IsUnique を無視し、SQLite はドキュメント全体にインデックスを張ります。JSON の値を計算列として公開し、その列に一意インデックスを設定してください。
- EF Core と Npgsql で PostgreSQL の jsonb 配列にアトミックに追加する方法
エンティティを読み込み、List.Add を呼んで保存すると、jsonb ドキュメント全体が書き換えられ、同時に行われた追加は黙って失われます。追加処理は jsonb の || 演算子を使った 1 つの UPDATE にまとめます。ExecuteSqlAsync を使うか、ExecuteUpdateAsync の中でマップした関数を使い、さらに @> によるガードで冪等にします。
- EF Core で Oracle のシーケンスを使って主キーを生成する方法
Oracle.EntityFrameworkCore 10 の UseSequence で EF Core のキーを Oracle のシーケンスにマッピングします。プロバイダーが実際に出力する DDL と INSERT の SQL、既存のシーケンスやレガシーなトリガーを使う方法、引用符と HiLo でつまずきやすい理由、そして ORA-00001 を起こさずに ID 列をシーケンスへ移行する方法を解説します。
- IPluralizer で dotnet ef dbcontext scaffold のテーブル名複数形化をカスタマイズする方法
Gas という名前のテーブルは Ga というエンティティにスキャフォールドされます。組み込みの Humanizer 複数形化サービスを独自の IPluralizer に置き換え、スタートアッププロジェクトの IDesignTimeServices から登録する方法と、そこで TryAddSingleton が黙って何もしない理由を解説します。
- 2 つのアプリインスタンスが同じメッセージを消費するときに EF Core 11 で冪等なメッセージ処理を保証する方法
ハンドラーの存在チェックは、あなたが思っているようなガードではありません。inbox テーブルに一意インデックスを張り、業務上の変更と同じ SaveChanges でマーカーを書き込み、勝者はデータベースに決めさせます。さらに、それを静かに台無しにする ExecuteUpdate の罠も扱います。
- EF Core 11 のマイグレーションで主キー、外部キー、インデックスにカスタム命名規則を適用する方法
EF Core 11 が生成する PK_、FK_、AK_、IX_ の名前を 1 つの IModelFinalizingConvention ですべて付け替え、明示的に指定した名前を優先させ、識別子の長さ制限に収め、既存データベースで次のマイグレーションが生成するクラスター化インデックスの再構築を回避します。
- EF Core 11 の生成 id エスケープ変更後に EF Core Cosmos アプリを移行する
EF Core 11 は Cosmos DB の生成 id 値に含まれる '/', '\', '?', '#' をエスケープしなくなったため、EF Core 8-10 で書き込んだドキュメントがキーで解決できなくなります。影響を受けるかどうかの確認方法、EscapeIllegalCosmosIdCharacters スイッチを設定すべき場面、そしてトランザクションバッチで id を安全に書き換える方法を解説します。
- SQL Server 互換性レベル 150 vs 160: EF Core 11 のクエリで何が変わるのか
EF Core 11 では UseSqlServer の既定の互換性レベルが 160 になり、LEAST、GREATEST、2 引数の LTRIM/RTRIM が SQL に入るようになりました。すべての Take(n).FirstOrDefault() も対象です。SQL Server 2022 以降なら 160 のままにし、SQL Server 2019 がまだ動いている環境が一つでもあれば UseCompatibilityLevel(150) で固定してください。
- 解決: EF Core の MigrateAsync と CanConnectAsync が 'Login failed for user' で 60 秒間リトライし続ける
EF Core の SQL Server 存在チェックは、EnableRetryOnFailure の有無にかかわらずエラー 18456 を丸 1 分間リトライします。即座に失敗させるか、RetryTimeout を短くするか、EF Core 12 を待ってください。
- 修正方法: EF Core の更新後に発生する Could not load file or assembly 'Microsoft.Data.SqlClient, Version=7.0.0.0'
EF Core 11 は Microsoft.Data.SqlClient 7.0.0.0 に対してコンパイルされていますが、リストアまたはデプロイで 6.x のコピーが採用されてしまっています。古い SqlClient の固定指定を削除し、出力全体を再デプロイしてください。
- 修正: EF Core 11 のプロジェクションで InvalidOperationException: Nullable object must have a value が発生する
Select が SQL の NULL を null 非許容の int、decimal、DateTime に読み込もうとすると、EF Core はこの例外をスローします。メンバーを null 許容型にキャストして ?? default を付けるか、ナビゲーションを null チェックで保護してください。
- EF Core 11 で EF.Functions.Like と StartsWith クエリの % と _ ワイルドカードをエスケープする方法
EF Core 11 では StartsWith、EndsWith、Contains が % と _ を自動でエスケープしますが、EF.Functions.Like はエスケープしません。EF が生成する SQL、再利用できるエスケープヘルパー、そして SQL Server、SQLite、PostgreSQL で正しく動作させるための escapeCharacter オーバーロードを解説します。
- EF Core 11 で SQL Server に JSON を保存するときのネイティブ json 列と nvarchar(max) の比較
SQL Server 2025 と Azure SQL ではネイティブの json 型を使いましょう。EF Core 11 はそこから JSON_CONTAINS、型付きの JSON_VALUE、インプレースの modify()、JSON インデックスを引き出せます。SQL Server 2019/2022、レガシーなツール、あるいはロールバックできる必要があるスキーマの場合は nvarchar(max) のままにしてください。
- 修正: PublishAot と EFOptimizeContext の組み合わせで EF Core のビルド中にメモリが枯渇する
EF Core のビルド時モデル生成が MSBuild を再帰的に呼び出し、RAM を使い切っていました。Tasks と Design を 10.0.10 以降に更新し、EF Core 11 では EFOptimizeContext を削除します。
- 解決: AS JSON option can be specified only for column of nvarchar(max) type in WITH clause
EF Core が OPENJSON WITH の内部に [col] json '$.path' AS JSON を出力し、Azure SQL が Msg 13618 で拒否します。EF Core 10.0.11 以降へ更新するか、プロバイダーの互換性レベルを 160 に下げてください。
- 解決: ToJson の複合コレクション保存時に Complex entry original ordinal '-1' is invalid が出る
Microsoft.EntityFrameworkCore を 10.0.10 以降へ更新してください。それ以前は、2 つ目の ToJson 複合プロパティ配下でネストしたコレクションが増えると SaveChanges が失敗しました。
- 解決: The complex type collection must be initialized to a non-null value
EF Core 10.0.x では、ToJson の複合コレクション内で 2 要素のコレクションを持つ複合プロパティに null を代入すると DetectChanges が壊れます。11.0.0-rc.1 で修正されました。
- 修正: EF Core Tools のアップグレード後に発生する MissingMethodException 'AbstractionsStrings.ArgumentIsEmpty'
Tools 10.0.6 が一致するバージョンの Microsoft.EntityFrameworkCore.Design を取得しなくなったため、dotnet ef が ArgumentIsEmpty で MissingMethodException を投げます。Design を EF Core のバージョンに固定してください。
- EF Core 11 で UPDLOCK と SELECT ... FOR UPDATE を使って悲観的ロックを取る方法
EF Core 11 にはいまだにロック用の API がありません。FromSql で実際の行ロックを取る方法を解説します。SQL Server では WITH (UPDLOCK, ROWLOCK)、PostgreSQL では FOR UPDATE、ロック範囲を静かに広げてしまうサブクエリの罠、NOWAIT と SKIP LOCKED、デッドロックのリトライ、そして行がまだ存在しない場合の対処法まで。
- データベースの null をコード上の非 null 値へ変換する EF Core 11 の value converter の書き方
EF Core はデフォルトでは value converter に null を渡しません。それを変える内部 API の convertsNulls コンストラクター、依存する IsRequired(false) の呼び出し、enum などの値型でどうしても機能しない理由、生まれてしまう WHERE col = NULL の罠、そして内部 API を使わずに目的を果たす 2 つのパターンを解説します。
- EF Core のインターセプターとは何か、どんなときに必要か
EF Core のインターセプターは、コマンドの実行や SaveChanges といった操作の前後で EF が呼び出すクラスで、観察するだけでなく操作を変更したり抑制したりできます。EF Core 11 の 7 つのインターセプトポイント、登録とライフタイムの規則、そしてクエリフィルターやログ出力のほうが適している場面をまとめます。
2026 / 08
- Fix: EF Core の並行 INSERT で発生する 23505: duplicate key value violates unique constraint
ハンドラーの「確認してから挿入」はアトミックではありません。SqlState 23505 の PostgresException を捕捉するか、全体を 1 つの INSERT ... ON CONFLICT 文にまとめてください。EnableRetryOnFailure は役に立ちません。
- 解決: dotnet ef database update 実行時の CREATE DATABASE permission denied in database 'master'
EF Core の Migrate() は常にデータベースの存在を確認し、なければハードコードされた master 接続で作成します。CREATE ANY DATABASE を付与するか、既存データベースへのログインのアクセスを直すか、冪等な SQL スクリプトを配布してください。
- 修正: .NET MAUI の iOS ビルドで発生する Model building is not supported when publishing with NativeAOT
iOS ビルドは DynamicCodeSupport=false を設定するため、NativeAOT を有効にしていなくても EF Core はモデルの構築を拒否します。コンパイル済みモデルと事前コンパイル済みクエリを出荷するか、インタープリターを再び有効にしてください。
- EF Core が Where、Select、OrderBy で変換できる再利用可能な LINQ 述語の書き方
bool を返すヘルパーメソッドは "could not be translated" を投げますが、Expression<Func<T, bool>> は投げません。LINQKit なしで EF Core 11 の式ツリーを合成、入れ子、再利用する方法を、各ケースの実際の SQL 付きで解説します。
- 修正: EF Core 11 の "An exception was thrown while attempting to evaluate a LINQ query parameter expression"
EF Core は、クライアント評価されるクエリの一部が評価中に例外を投げたときにこれを出します。InnerException を読み、EnableSensitiveDataLogging を有効にして、null チェックをラムダの外へ出してください。
- EF Core 11 で insert 時にデータベースのシーケンスから主キーを生成する方法
EF Core 11 の UseSequence でキーを IDENTITY から SQL Server のシーケンスへ移す方法です。EF が実際に発行する SQL、明示的なキー値が IDENTITY_INSERT なしで通るようになる理由、int 列に bigint シーケンスをつないでしまう罠、そして設計時に見込んでおくべき欠番を扱います。
- Blazor のシングルトンサービスから IDbContextFactory<T> を使う方法
シングルトンは DbContext を注入できませんが、IDbContextFactory<T> なら注入できます。AddDbContextFactory がファクトリを既定でシングルトンとして登録するからです。呼び出しごとにコンテキストを生成して破棄し、インスタンスは決して保持しないでください。
- 修正: dotnet tool install --global dotnet-ef がエラーを出す
.NET 10 SDK で dotnet tool install --global dotnet-ef が失敗するすべてのパターンを、正確なメッセージと終了コード付きで解説します。インストール済み、バージョンが見つからない、ダウングレード拒否、shim の衝突、到達できない NuGet フィード、そしてインストール成功後に初めて壊れるランタイム不一致。
- EF Core 11 でストアドプロシージャを呼び出して結果をマッピングする方法
プロシージャがエンティティの全列を返す場合は DbSet の FromSql、射影を返す場合は Database.SqlQuery<T>、何も返さない場合は ExecuteSql を使います。EXEC に LINQ 演算子を連結してはいけません。また、リーダーが破棄される前に出力パラメーターを読んではいけません。
- EF Core 11 のマイグレーションでデータを失わずにテーブル名を変更する方法
テーブル名を変更した場合、EF Core は RenameTable を生成しますが、エンティティクラスの名前を変更した場合は DropTable と CreateTable を生成します。この2つを見分ける方法、クラス名変更のコストをゼロにする ToTable のテクニック、そしてデータを黙って入れ替えてしまう列名変更のバグを解説します。
- ASP.NET Core の統合テストにおける WebApplicationFactory と Testcontainers の比較
ASP.NET Core の統合テストで確認する対象に応じて、HTTP ルーティング、本番データベース、発行済みアプリイメージのどこを実行するか選びます。
- EF Core 11 で rowversion トークンを使って楽観的同時実行制御を実装する方法
EF Core 11 に rowversion の同時実行トークンを追加します。[Timestamp] と IsRowVersion による設定、EF が実際に発行する SQL、DbUpdateConcurrencyException の捕捉、データベース優先 vs クライアント優先 vs マージ、ETag を使った切断された API、そして保護を無言で無効化する 5 つの落とし穴。
- EF Core 11 で value converter を使って enum を文字列として保存する方法
EF Core 11 で C# の enum を int ではなく読みやすい文字列として保存する方法です。HasConversion、すべての enum への一括設定、nvarchar(max) の罠、並び順の落とし穴、既存の int 列の移行手順を扱います。
2026 / 07
- 解決: Your startup project doesn't reference Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Design は DbContext を含むプロジェクトではなく、dotnet ef がビルドするスタートアッププロジェクトに追加し、階層化されたソリューションでは -s を渡します。
- 解決: EF Core 11 の "The model for context 'X' has pending changes"
モデルが直近のマイグレーションのスナップショットと一致しないと EF Core は PendingModelChangesWarning を投げます。マイグレーションを追加するか、誤検知の原因を直します。
- dotnet ef migrations bundle で EF Core 11 のマイグレーションを本番に適用する方法
EF Core 11 のスキーマ変更をマイグレーション bundle でデプロイするための完全ガイドです。CI での efbundle のビルド、名前付き接続文字列における appsettings.json の落とし穴、self-contained bundle と Alpine の musl RID、EF Core 9 以降のマイグレーションロック、対象マイグレーションを指定したロールバック、そして MySQL ではマイグレーション単位のトランザクションが助けにならない理由を解説します。
- EF Core 11 における複合型 vs 所有エンティティ: どちらを選ぶべきか
EF Core 11 では、値オブジェクトにはデフォルトで複合型を使い、別テーブルが必要な場合や独自の行にマッピングされたコレクションが必要な場合にのみ所有エンティティに切り替えてください。
- EF Core 11 の継承マッピングにおける TPH vs TPT vs TPC: どれを選ぶべきか
EF Core 11 では、ほぼすべての階層でデフォルトとして TPH を使い、単一のリーフ型をほぼ常にクエリしベンチマークで勝ると証明できる場合のみ TPC を選び、外部の制約に強いられる場合のみ TPT を使います。
- 解決: System.InvalidOperationException: Sequence contains no elements
この例外は、空のシーケンスに対して .First() や .Single() を呼び出したことを意味します。FirstOrDefault/SingleOrDefault で null をチェックするか、クエリをガードするか、ソースが空になる原因を修正します。
- EF Core 11 が生成する SQL をログ出力する方法
Entity Framework Core 11 がデータベースに送信する正確な SQL を、パラメーター値とともに、LogTo、Microsoft.Extensions.Logging、ToQueryString で確認します。
- 解決: EF Core 11 で "The property could not be mapped, because it is not a supported primitive type or a valid entity type"
EF Core が保存方法を知らないプロパティに遭遇しました。complex type としてマッピングするか、HasConversion で変換するか、キーを与えるか、[NotMapped] で無視しましょう。
- EF Core 11 で Table-per-Hierarchy (TPH) の継承マッピングを構成する方法
TPH は EF Core の既定の継承戦略です。1 つのテーブルと 1 つの識別子列を使います。識別子の構成、列の共有、派生型の null 許容プロパティの扱い、そして EF Core 11 での注意点を解説します。
- EF Core 11 で所有エンティティの代わりに複合型をマッピングする方法
所有エンティティは値オブジェクトと相性の悪い隠れたキーと参照同一性を持ちます。EF Core 11 で値オブジェクトを複合型としてマッピングする方法、切り替えるべきタイミング、そして注意点を解説します。
- EF Core 11 で HasData シーディングから UseAsyncSeeding へ移行する
EF Core 11 でシードデータを HasData から UseSeeding と UseAsyncSeeding へ移す手順ガイド。見落とすと既存の行を削除してしまう DeleteData マイグレーションの落とし穴も含みます。
- EF Core 11 の名前付きクエリフィルター vs 単一のグローバルクエリフィルター: どちらを使うべきか
どちらも同じ SQL を生成します。名前付きフィルターに頼るのは、predicate を個別に無効化する必要があるときだけです。単一の関心事なら、EF Core 11 では 1 つに結合したフィルターの方がシンプルです。
- 解決: EF Core 11 で "The LINQ expression could not be translated"
EF Core 11 は、Where や OrderBy が SQL に変換できないメソッドを呼び出すとこれをスローします。予測を変換可能な演算子で書き直すか、先に AsEnumerable でデータをクライアントに取り込みましょう。
- 修正: EF Core 11 の "The required column 'X' was not present in the results of a 'FromSql' operation"
生の SQL がエンティティにマッピングされたすべての列を返さない、または名前が一致しないと EF Core はこの例外を投げます。一致する名前ですべてのマッピング列を返すか、スカラー型やキーレス型を照会してください。
- EF Core 11 で名前付きクエリフィルターを使ってソフト削除とマルチテナンシーを実装する方法
EF Core 11 で同じエンティティに 2 つの独立したグローバルクエリフィルターを適用します。ソフト削除フィルターとテナントフィルターにそれぞれ名前を付け、IgnoreQueryFilters で一方だけを無効化できるようにします。
2026 / 06
- EF Core 11 でのデータシードにおける HasData vs UseSeeding: どちらを使うべきか?
HasData は固定的でモデルが所有する参照データにのみ使います。EF Core 11 のそれ以外すべてには UseSeeding と UseAsyncSeeding を使います。判断を決定づけるルールとともに並べて比較します。
- 解決方法: EF Core 11 でエンティティを削除すると FOREIGN KEY constraint failed が発生する
親にまだ依存行が残っており、データベースがそれらを孤立させることを拒否するため、EF Core は FOREIGN KEY constraint failed をスローします。子を読み込む、リレーションシップをオプションにする、または OnDelete を設定してください。
- 解決方法: No service for type 'Microsoft.EntityFrameworkCore.DbContextOptions' has been registered
AddDbContext が実行されなかった、Build の後で実行された、またはコンテキストのコンストラクターが誤った DbContextOptions を受け取ると EF Core はこれをスローします。Build より前に登録し、DbContextOptions<YourContext> を使ってください。
- 修正: The seed entity for entity type 'X' cannot be added because a non-zero value is required for property 'Id'
HasData がストア生成キーのエンティティを明示的な値なしでシードしています。各行に安定したゼロ以外の Id を与えるか、生成キーには UseSeeding を使ってください。
- EF Core 11 でキーセット (カーソル) ページネーションを実装する方法
Skip/Take を、最後に見た行の先までシークする WHERE 句に置き換えます。完全に一意なキーで並べ替え、最後の行の値をカーソルとして引き継げば、EF Core 11 は次のページを OFFSET スキャンではなくインデックスシークに変えてくれます。
- EF Core 11 で JSON カラムをマッピングしてクエリする方法
ComplexProperty(...).ToJson() でネストした型を単一の JSON カラムにマッピングし、EF Core 11 に SQL Server 2025 のネイティブ json データ型で保存させ、JSON_VALUE・JSON_CONTAINS・JSON_PATH_EXISTS に変換される LINQ でクエリします。
- EF Core 11 で多対多リレーションシップにシードデータを投入する方法
EF Core 11 で多対多リレーションシップの結合テーブルにシードデータを投入する方法: 自分で名前を付ける必要がある暗黙のシャドウキー、UsingEntity と HasData のパターン、そしてスキップナビゲーションで動作する実行時の UseSeeding 代替手段。
- EF Core 11 で UseSeeding と UseAsyncSeeding を使ってデータをシードする方法
EF Core 11 で UseSeeding と UseAsyncSeeding を使って参照データを正しくシードします。どこで設定するか、いつ実行されるか、省略できない冪等性チェック、そしてなぜ両方を実装する必要があるのかを解説します。
- EF Core 11 における AsNoTracking と AsNoTrackingWithIdentityResolution: どちらを使うべきか
読み取り専用のクエリにはデフォルトで AsNoTracking を使います。結果のグラフが同じエンティティを複数回含み、かつコードが単一の共有インスタンスを受け取ることに依存している場合にのみ AsNoTrackingWithIdentityResolution を使います。
- EF Core 11 の新しい EF1004 アナライザーが静かな非同期ミスを検出します
EF Core 11 Preview 5 には EF1004 アナライザーが含まれます。IQueryable に対する ToAsyncEnumerable() を指摘し、await foreach の中でデータベースクエリを誤って同期的に列挙しないようにします。
- 解決: EF Core 11 の The entity type 'X' requires a primary key to be defined
EF Core が型の主キーを見つけられません。プロパティを Id か {Type}Id と名付ける、[Key] を付ける、HasKey を呼ぶ、もしくはビューや生の SQL なら HasNoKey を呼びます。
- 解決: The configured execution strategy 'SqlServerRetryingExecutionStrategy' does not support user-initiated transactions
EnableRetryOnFailure は BeginTransaction と競合します。トランザクション全体を db.Database.CreateExecutionStrategy().ExecuteAsync(...) でラップし、1 つの単位として再試行させます。
- EF Core 11 のインターセプターで監査を行う方法
ISaveChangesInterceptor を使って EF Core 11 で CreatedBy/ModifiedOn 列をスタンプし、完全な変更履歴を記録します。DI のライフタイム、現在のユーザー、ExecuteUpdate の落とし穴も解説します。
- EF Core の ExecuteUpdate とエンティティの読み込み+SaveChanges:どちらを使うべきか
EF Core 11 のための意思決定ガイドと実測ベンチマーク。述語による集合ベースの書き込みには ExecuteUpdate を使い、変更トラッカー、インターセプター、複雑なオブジェクトグラフが必要なときだけ読み込み→SaveChanges の経路を選びます。
- EF Core 6 から EF Core 11 への移行: 本当に効いてくる破壊的変更
EF Core 6.0 から EF Core 11.0 へのバージョン固定の移行ガイド。実際のアプリを壊す EF7、8、9、10、11 の破壊的変更を辿ります: Encrypt=True、OPENJSON による Contains、PendingModelChangesWarning、ネイティブ json 列、そして SqlClient 7.0 の分割。
- 解決: ObjectDisposedException: Cannot access a disposed context instance
fire-and-forget タスクが、DI スコープがすでに破棄したリクエストスコープの DbContext をキャプチャしました。IServiceScopeFactory または IDbContextFactory でタスク内に新しいコンテキストを解決してください。
- EF Core 11 Preview 4: .config/dotnet-ef.json で --project と --startup-project の打ち直しをやめる
EF Core 11 Preview 4 では dotnet ef ツールが .config/dotnet-ef.json ファイルからオプションの既定値を読み込めるようになり、分割されたソリューションでもすべてのコマンドで --project と --startup-project を渡す必要がなくなります。
- EF Core 11 でクエリ分割を使ってデカルト爆発を避ける方法
2 つの同階層コレクションを Include すると、EF Core 11 はクロス積を返し、行数が爆発します。AsSplitQuery でこれをどう解決するか、グローバルに有効化する方法、そして注意すべき整合性と並び順の落とし穴を解説します。
2026 / 05
- EF Core 11 で ExecuteUpdate と ExecuteDelete を使って一括書き込みを行う方法
EF Core 11 の ExecuteUpdate と ExecuteDelete の完全ガイド。生成される SQL、一括書き込みを静かに上書きしてしまう変更トラッカーの落とし穴、トランザクション、影響を受けた行数による同時実行制御、そして EF Core 10 のデリゲートセッターで単純な if 文を使って条件付き更新を組み立てる方法を解説します。
- EF Core 11 Preview 4: テンポラルテーブルの期間列がついに本物のプロパティになれる
EF Core 11 Preview 4 で SQL Server テンポラルテーブルに対する長年の shadow プロパティ制約が撤廃されました。PeriodStart と PeriodEnd を通常の CLR プロパティとして宣言し、強く型付けされた HasPeriodStart と HasPeriodEnd のラムダで設定できます。
- EF Core のコンパイル済みクエリ vs 生 SQL vs Dapper: 読み取りパスではどれが勝つか?
.NET 11 の読み取り中心のパスでは、AsNoTracking を付けた素の EF Core は Dapper の ~5% 以内に収まります。コンパイル済みクエリはプロファイル済みの単一行ホットパスで使い、Dapper は最小のレイテンシや LINQ で表現できない SQL のためだけに使いましょう。
- C# における IEnumerable vs IAsyncEnumerable vs IQueryable:メソッドは何を返すべきか
3 つのシーケンスインターフェース、3 つの実行モデル。データベースがクエリを変換できる場合は IQueryable を、プロデューサーが非同期でストリーミングしたい場合は IAsyncEnumerable を、それ以外のメモリ内のものには IEnumerable を使用します。
- EF Core 11 vs Dapper の一括挿入: リアルなベンチマーク
.NET 11 での一括挿入では、EF Core も Dapper も勝ちません。SqlBulkCopy が勝ちます。これはそのベンチマークと理由、そして各ツールにふさわしい場所です。
- Fix: A possible object cycle was detected
System.Text.Json は逆参照を持つグラフのシリアライズを拒否します。ReferenceHandler.IgnoreCycles を設定するか、DTO に射影するか、逆向きポインタに [JsonIgnore] を付けてください。Preserve は最終手段です。
- 修正: EF Core マイグレーション中の SqlException: Timeout expired
マイグレーションはランタイムの CommandTimeout ではなくデザインタイムの DbContext を使用します。UseSqlServer(o => o.CommandTimeout(...))、接続文字列の Command Timeout、または Migrate() の前の Database.SetCommandTimeout でタイムアウトを設定してください。
- Fix: dotnet ef migrations add が 'Unable to create an object of type DbContext' で失敗する
EF Core の設計時ツールが DbContext のインスタンスを作成できませんでした。WebApplication.CreateBuilder で host を公開するか、正しい startup project を指定するか、IDesignTimeDbContextFactory を実装してください。
- 修正: The instance of entity type cannot be tracked because another instance with the same key value is already being tracked
EF Core 11 は、1 つの DbContext 内で 2 つのオブジェクトが主キーを共有するとこの例外をスローします。古い方をデタッチするか、その場で更新してください。読み取り側の AsNoTracking で衝突を防げます。
- 修正: A second operation was started on this context instance before a previous operation completed
EF Core は同じ DbContext 上で 2 つの await が並行に実行されるとこの例外をスローします。各呼び出しを順次 await するか、IDbContextFactory で並行する作業単位ごとに新しい DbContext を取得してください。
- 修正: System.InvalidOperationException: No connection string named 'DefaultConnection' could be found
.NET 11 で GetConnectionString が null を返す場合、appsettings.json にキーがない、ビルド出力にコピーされていない、または間違った環境ファイルが選ばれているかのいずれかです。3 つのチェックで 95% のケースが解決します。
- EF Core 11 で N+1 クエリを検出する方法
EF Core 11 で N+1 クエリを見つけるための実践ガイドです。実際のコードで N+1 がどのように現れるか、ログ、診断インターセプター、OpenTelemetry を使ってどのように可視化するか、そしてホットパスがリグレッションしたときにビルドを壊すテストの書き方を解説します。
- ホットパス向けに EF Core でコンパイル済みクエリを使う方法
EF Core 11 のコンパイル済みクエリを実践的に解説します。EF.CompileAsyncQuery が本当に効くのはどんなときか、static フィールドのパターン、Include とトラッキングの落とし穴、追加の手間を払う価値があったと証明するためのビフォー/アフターのベンチマーク方法までを取り上げます。
- Testcontainers で本物の SQL Server に対する統合テストを書く方法
Testcontainers 4.11 と EF Core 11 を使い、ASP.NET Core の統合テストを本物の SQL Server 2022 に対して実行するための完全ガイドです。WebApplicationFactory の組み立て、IAsyncLifetime、DbContext 登録の差し替え、マイグレーションの適用、並列実行、Ryuk によるクリーンアップ、CI のはまりどころを解説します。
2026 / 04
- EF Core のモデルを最初のクエリの前にウォームアップする方法
EF Core は最初の DbContext アクセスで概念モデルを遅延構築するため、新しいプロセスでの最初のクエリは以後のどのクエリよりも数百ミリ秒遅くなります。本ガイドでは EF Core 11 で実用に足る三つの対策を扱います: Model に触れて接続を開く起動時の IHostedService、事前コンパイル済みモデルを出荷する dotnet ef dbcontext optimize、そして二つの対策を静かに無効化するキャッシュキーの落とし穴です。
- 変更追跡を壊さずに DbContext をモックする方法
DbContext を直接モックすると ChangeTracker が静かに壊れます。だからこそ Microsoft はそれを推奨していません。本ガイドは EF Core 11 で実際に機能する 2 つのパターンを示します。接続を開いたまま保持して本物の ChangeTracker を動かす SQLite インメモリと、テストから EF Core を完全に追い出すリポジトリパターンです。
- EF Core 11 で IAsyncEnumerable<T> を使う方法
EF Core 11 のクエリは IAsyncEnumerable<T> を直接実装しています。await foreach で行をストリーミングする方法、ToListAsync より好むべきタイミング、接続・トラッキング・キャンセルまわりの落とし穴。
- EF Core 11 で record を正しく使う方法
C# の record と EF Core 11 を組み合わせる実践的なガイド。record がどこに収まり、どこで change tracking を壊すのか、そしてフレームワークと戦わずに value object、エンティティ、プロジェクションをモデリングする方法。
- EF Core 11 が split query で不要な reference join を刈り込む
EF Core 11 Preview 3 は split query から冗長な to-one join を除去し、不要な ORDER BY キーを落とします。報告された一つのシナリオは 29% 速くなり、別のは 22% でした。今の SQL はこう見えます。
- EF Core 11 が DetectChanges をスキップする GetEntriesForState を追加
EF Core 11 Preview 3 は ChangeTracker.GetEntriesForState を導入します。state フィルターされた enumerator で、SaveChanges interceptor や audit hook のようなホットパスで余分な DetectChanges パスを避けます。
- EF Core 11 がデフォルトで Cosmos DB transactional batch を有効にする
EF Core 11 は Cosmos DB の書き込みを SaveChanges ごとに container と partition 単位で transactional batch にグループ化し、コード変更なしで best-effort な原子性とラウンドトリップ削減を提供します。
- EF Core 11 で 1 つのコマンドでマイグレーションを作成して適用できる
dotnet ef database update コマンドが、マイグレーションを 1 つのステップでスキャフォールドして適用するための --add を受け入れるようになりました。仕組み、コンテナと .NET Aspire にとって重要な理由、注意点を紹介します。
- EF Core 11 が DiskANN インデックスでネイティブな SQL Server ベクトル検索を追加
EF Core 11 Preview 2 は SQL Server 2025 の VECTOR_SEARCH() と DiskANN ベクトルインデックスを LINQ から直接サポートします。インデックスのセットアップ、近似クエリの実行方法、EF Core 10 の VectorDistance アプローチからの変更点を紹介します。