このページでは、EF Core 10 から EF Core 11 に更新される既存のアプリケーションを中断する可能性がある API と動作の変更について説明します。 以前のバージョンの EF Core から更新する場合は、以前の破壊的変更を確認してください。
概要
注
Microsoft.Data.Sqlite を使用している場合は、後述の「Microsoft.Data.Sqlite の破壊的変更」についてのセクションをご覧ください。
| 破壊的変更 | 影響 |
|---|---|
| Azure Cosmos DB プロバイダー経由の同期 I/O が完全に削除されました | ミディアム |
| ミディアム | |
| 移行が見つからないときに EF Core が既定でスローされるようになりました | 低 |
EFOptimizeContext MSBuild プロパティが削除されました |
低 |
| EF ツール パッケージは、Microsoftを参照しなくなりました。EntityFrameworkCore.Design | 低 |
| SqlVector プロパティが既定で読み込まれなくなりました | 低 |
| Cosmos: 空の所有コレクションが null ではなく空のコレクションを返すようになりました | 低 |
影響が中程度の変更
Azure Cosmos DB プロバイダー経由の同期 I/O が完全に削除されました
以前の動作
AZURE COSMOS DB プロバイダー経由の同期 I/O は、EF 9.0 (note) 以降サポートされていません。特別なオプトインが構成されていない限り、ToList や SaveChanges などの同期 I/O API を呼び出すと例外がスローされました。 オプトインが構成されている場合、同期 I/O API は以前と同様に機能し、プロバイダーは Azure Cosmos DB SDK に対して "sync-over-async" ブロックを実行するため、デッドロックやその他のパフォーマンスの問題が発生する可能性があります。
新しい動作
EF Core 11.0 以降では、同期 I/O API が呼び出されたときに EF が常にスローされるようになりました。 同期 I/O API の使用をオプトバックする方法はありません。
なぜでしょうか
非同期メソッド ("sync-over-async") での同期ブロックは非常に推奨されておらず、デッドロックやその他のパフォーマンスの問題につながる可能性があります。 Azure Cosmos DB SDK が非同期メソッドのみをサポートするため、EF Cosmos プロバイダーも非同期メソッドをサポートします。
緩和 策
同期 I/O API ではなく非同期 I/O API を使用するようにコードを変換します。 たとえば、 SaveChanges() の呼び出しを await SaveChangesAsync()に置き換えます。
Microsoft。Data.SqlClient が 7.0 に更新されました
以前の動作
EF Core 10 は Microsoft を使用します。Data.SqlClient 6.x。コア パッケージにAzure/Entra ID認証の依存関係 (Azure.Core、Azure.Identity、Microsoft.Identity.Client など) が含まれています。
新しい動作
EF Core 11 は、Microsoft に依存するようになりました。Data.SqlClient 7.0。 このバージョンでは、Azure/Entra ID (以前のAzure Active Directory) 認証の依存関係がコア パッケージから削除されます。 アプリケーションでEntra ID認証 (ActiveDirectoryDefault、ActiveDirectoryInteractive、ActiveDirectoryManagedIdentity、ActiveDirectoryServicePrincipal など) を使用する場合は、Microsoft.Data.SqlClient.Extensions.Azure パッケージを個別にインストールする必要があります。
さらに、 SqlAuthenticationMethod.ActiveDirectoryPassword は古いものとしてマークされています。
詳細については、Microsoftを参照してください。Data.SqlClient 7.0 リリース ノート。
なぜでしょうか
この変更は、Microsoft で行われました。Data.SqlClient:Azure認証を使用しないアプリケーションの依存関係の肥大化を軽減します。これは、コンテナー化されたデプロイやローカル開発に特に役立ちます。
緩和 策
アプリケーションで SQL Server でのEntra ID認証を使用する場合は、プロジェクトの Microsoft.Data.SqlClient.Extensions.Azure パッケージへの参照を追加します。
<PackageReference Include="Microsoft.Data.SqlClient.Extensions.Azure" Version="7.0.0" />
このパッケージ参照を追加する以外にコードを変更する必要はありません。
SqlAuthenticationMethod.ActiveDirectoryPasswordを使用する場合は、ActiveDirectoryDefaultやActiveDirectoryInteractiveなどの最新の認証方法に移行します。
影響が小さい変更
移行が見つからないときに EF Core が既定でスローされるようになりました
以前の動作
以前は、アセンブリに移行がないデータベースで Migrate または MigrateAsync を呼び出すときに、EF Core は情報メッセージをログに記録し、変更を適用せずに返しました。
新しい動作
EF Core 11.0 以降では、アセンブリに移行が見つからない場合、EF Core は既定で例外をスローします。 これは、EF 9.0 で導入されたPendingModelChangesWarning動作と一致します。
なぜでしょうか
通常、移行が存在しない場合に Migrate() または MigrateAsync() を呼び出すと、構成が正しくないことを示します。 EF Core では、データベースをサイレントに続行して間違っている可能性がある状態のままにするのではなく、開発者にすぐにこの問題を通知するようになりました。
緩和 策
移行を行わずに意図的に Migrate() を呼び出す場合 (たとえば、他の方法でデータベース スキーマを管理するため)、 Migrate() 呼び出しを削除するか、警告を構成して例外を抑制します。
options.ConfigureWarnings(w => w.Ignore(RelationalEventId.MigrationsNotFound))
または、スローする代わりにイベントをログに記録します。
options.ConfigureWarnings(w => w.Log(RelationalEventId.MigrationsNotFound))
EFOptimizeContext MSBuild プロパティが削除されました
以前の動作
以前は、 EFOptimizeContext MSBuild プロパティを true に設定して、ビルドまたは発行中にコンパイル済みモデルとプリコンパイル済みクエリ コードの生成を有効にできました。
<EFOptimizeContext Condition="'$(Configuration)'=='Release'">true</EFOptimizeContext>
新しい動作
EF Core 11.0 以降では、 EFOptimizeContext MSBuild プロパティが削除されました。 コード生成は、 EFScaffoldModelStage プロパティと EFPrecompileQueriesStage プロパティを使用して排他的に制御されるようになりました。
PublishAOTが true に設定されている場合、追加のプロパティを必要とせずに、発行中にコード生成が自動的に有効になります。
なぜでしょうか
EFScaffoldModelStageプロパティとEFPrecompileQueriesStageプロパティでは、コード生成が発生するタイミングをきめ細かく制御できます。
EFOptimizeContext は冗長有効化ゲートでした。
緩和 策
EFOptimizeContextの使用法をEFScaffoldModelStageプロパティとEFPrecompileQueriesStageプロパティに置き換えます。 これらは、 publish または build に設定して、コード生成が発生するステージを制御できます。
<EFScaffoldModelStage>publish</EFScaffoldModelStage>
<EFPrecompileQueriesStage>publish</EFPrecompileQueriesStage>
その他の値 (たとえば、 none) は、対応する生成を無効にします。
PublishAOTに設定true場合、発行時にコード生成が自動的に有効になり、追加の構成は必要ありません。
EF ツール パッケージが Microsoft.EntityFrameworkCore.Design を参照しなくなりました
以前の動作
以前は、Microsoft.EntityFrameworkCore.Tools パッケージと Microsoft.EntityFrameworkCore.Tasks NuGet パッケージは、Microsoft.EntityFrameworkCore.Design に依存していました。
新しい動作
EF Core 11.0 以降、Microsoft.EntityFrameworkCore.Tools および Microsoft.EntityFrameworkCore.Tasks NuGet パッケージは、Microsoft.EntityFrameworkCore.Design に依存しなくなりました。
なぜでしょうか
Microsoft.EntityFrameworkCore.Design のコードに対するハード依存関係はなく、この依存関係は、古いフレームワークを対象とするプロジェクトで最新の Microsoft.EntityFrameworkCore.Tools を使用するときに問題を引き起こしていました。
緩和 策
プロジェクトがツール パッケージを通じて推移的に取り込まれるMicrosoft.EntityFrameworkCore.Designに依存している場合は、プロジェクトに直接参照を追加します。
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="11.0.0" PrivateAssets="all" />
SqlVector プロパティが既定で読み込まれなくなりました
以前の動作
以前は、 SqlVector<T> プロパティを使用してエンティティにクエリを実行する場合、EF Core は SELECT ステートメントにベクター列を含め、返されたエンティティにプロパティを設定しました。
新しい動作
EF Core 11.0 以降では、エンティティを具体化するときに、 SqlVector<T> プロパティが SELECT ステートメントに含まれないようになりました。 返されたエンティティのプロパティはnullとなります。
ベクター プロパティは、WHEREやORDER BYを含め、VectorDistance()句とVectorSearch()句で引き続き使用できます。これらはエンティティ プロジェクションには含まれません。
なぜでしょうか
ベクター列は非常に大きく、数百または数千の浮動小数点値を含むことができます。 ほとんどの場合、ベクターはデータベースに書き込まれ、検索に使用され、読み戻す必要はありません。 既定で SELECT から除外すると、不要なデータ転送が回避されます。
緩和 策
注
ベクター プロパティを自動読み込みに戻すメカニズムは、EF Core 11 リリースの後半で導入される予定です。
ベクター値を読み戻す必要がある場合は、明示的なプロジェクションを使用します。
var embeddings = await context.Blogs
.Select(b => new { b.Id, b.Embedding })
.ToListAsync();
Cosmos: 空の所有コレクションが null ではなく空のコレクションを返すようになりました
以前の動作
以前は、所有するコレクションに項目が含まれなかったAzure Cosmos DB プロバイダーを介してエンティティに対してクエリを実行する場合、コレクション プロパティは具体化されたエンティティに対して nullでした。
新しい動作
EF Core 11.0 以降では、Azure Cosmos DB プロバイダーは空の所有コレクションを正しく初期化し、null ではなく空のコレクションを返します。
なぜでしょうか
空の所有コレクションを null として具体化する以前の動作はバグでした。
緩和 策
コレクションが空であることを検出するために null の所有コレクション プロパティをコードで明示的にチェックする場合は、コレクションが常に初期化されるため、これらのチェックは単に削除できます。
// Before
if (entity.OwnedCollection is null or { Count: 0 })
{
// treated as empty
}
// After
if (entity.OwnedCollection is { Count: 0 })
{
// treated as empty
}
Microsoft.Data.Sqlite の破壊的変更
注
SQLitePCLRaw は、Microsoftによって所有または管理されていない、コミュニティが管理する外部ライブラリです。 Microsoft。Data.Sqlite は、SQLite 接続に依存します。
概要
| 破壊的変更 | 影響 |
|---|---|
| 暗号化が有効な SQLite パッケージが削除されました | ミディアム |
| 一部の SQLitePCLRaw バンドル パッケージが削除されました | ミディアム |
影響が中程度の変更
暗号化が有効な SQLite パッケージが削除されました
以前の動作
以前は、 SQLitePCLRaw.bundle_e_sqlcipher NuGet パッケージでは、暗号化が有効な SQLite ビルドが無償で提供されました。
新しい動作
SQLitePCLRaw 3.0 以降 (Microsoftによって使用されます。Data.Sqlite 11.0)、SQLitePCLRaw.bundle_e_sqlcipher パッケージは非推奨となり、NuGet から削除されました。 コストなしの暗号化が有効な SQLite ビルドは配布されなくなりました。
なぜでしょうか
以前の無償の SQLitePCLRaw.bundle_e_sqlcipher パッケージはほとんど維持されていませんでした。これは、セキュリティの脆弱性の修正プログラムが適用されない可能性がある暗号化ソフトウェアにとって重大な懸念事項です。 SQLitePCLRaw 保守担当者は、継続的なセキュリティ更新プログラムを提供する、専門的に保守された有料の代替手段を優先して、バージョン 3.0 でこれらのビルドを削除しました。
緩和 策
SQLite 暗号化が必要な場合は、次のオプションがあります。
- SQLite 暗号化拡張機能 (SEE): これは、SQLite チームからの公式の暗号化実装です。 有料ライセンスが必要です。 詳細については、https://sqlite.org/com/see.html を参照してください。 NuGet パッケージは、 SourceGear の SQLite ビルド サービスを通じて利用できます。
- SQLCipher: Zetetic からサポートされているビルドを購入するか、オープンソース コードを自分でビルドします。
-
SQLite3 の複数の暗号: NuGet パッケージは SQLite3MultipleCiphers-NuGet から入手できます。
- 新しいデータベースを暗号化する場合、または SQLCipher で暗号化された既存のデータベースを開く場合は、URI パラメーター (例:
Data Source=file:example.db?cipher=sqlcipher&legacy=4;Password=<password>) を使用して接続文字列で暗号スキームを構成する必要があります。 詳細については、 SQLCipher で暗号化された既存のデータベースを開く方法 を参照してください。
- 新しいデータベースを暗号化する場合、または SQLCipher で暗号化された既存のデータベースを開く場合は、URI パラメーター (例:
詳細については、 SQLitePCLRaw および SQLitePCLRaw3.0 リリース ノートで使用する SQLite 暗号化オプションを参照してください。
一部の SQLitePCLRaw バンドル パッケージが削除されました
以前の動作
以前は、 SQLitePCLRaw.bundle_sqlite3、 SQLitePCLRaw.bundle_winsqlite3、 SQLitePCLRaw.bundle_green、および SQLitePCLRaw.bundle_e_sqlite3mc パッケージは、対応する SQLite プロバイダーで SQLitePCLRaw を構成するための便利な方法を提供しました。
新しい動作
SQLitePCLRaw 3.0 以降 (Microsoftによって使用されます。Data.Sqlite 11.0)、これらのバンドル パッケージは削除されました。 アプリケーションがこれらのバンドルのいずれかに依存している場合は、対応するプロバイダー パッケージを参照し、明示的に初期化する必要があります。
なぜでしょうか
これらの各バンドル パッケージには、1 行の構成コードのみが含まれており、不要なパッケージ化のオーバーヘッドが追加されました。 対応するプロバイダー パッケージは引き続きサポートされています。
緩和 策
削除されたバンドル パッケージを対応するプロバイダー パッケージに置き換え、明示的な初期化コードを追加します。
bundle_sqlite3またはbundle_winsqlite3を使用している場合は、パッケージ参照を置き換えます。
<!-- Old -->
<PackageReference Include="SQLitePCLRaw.bundle_sqlite3" Version="2.x.x" />
<!-- or -->
<PackageReference Include="SQLitePCLRaw.bundle_winsqlite3" Version="2.x.x" />
<!-- New -->
<PackageReference Include="SQLitePCLRaw.provider.sqlite3" Version="3.x.x" />
<!-- or -->
<PackageReference Include="SQLitePCLRaw.provider.winsqlite3" Version="3.x.x" />
SQLite を使用する前に明示的な初期化を追加します。
// For sqlite3
static void Init()
{
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
}
// For winsqlite3
static void Init()
{
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_winsqlite3());
}
bundle_greenを使用する場合は、SQLitePCLRaw.bundle_e_sqlite3に切り替える移行パスをお勧めします。 または、SQLitePCLRaw.config.e_sqlite3SourceGear.sqlite3などの別のネイティブ ライブラリ パッケージと組み合わせて使用します。これにより、SQLite バージョンを個別に更新できます。
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.x.x" />
iOS のみを対象とし、システム SQLite ライブラリを引き続き使用する場合は、プロバイダーを直接参照してください。
<PackageReference Include="SQLitePCLRaw.core" Version="3.x.x" />
<PackageReference Include="SQLitePCLRaw.provider.sqlite3" Version="3.x.x" />
明示的に初期化します。
static void Init()
{
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
}
注
SQLitePCLRaw.bundle_e_sqlite3を使用している場合は、変更は必要ありません。バージョン番号を更新するだけです。 詳細については、 SQLitePCLRaw 3.0 リリース ノート を参照してください。
.NET