Scaffold-DbContext 実行時の CultureNotFoundException エラーの解決
環境固有のエラー
.NET 7/8 で Scaffold-DbContext
を実行中に以下のエラーが発生する場合:
System.Globalization.CultureNotFoundException:
Only the invariant culture is supported in globalization-invariant mode.
(Parameter 'name') en-us is an invalid culture identifier.
この問題はプロジェクト設定が原因で発生しています
問題の根本原因
このエラーは、プロジェクトがグローバリゼーション不変モード(globalization-invariant mode) で動作しているときに、カルチャ固有の処理(ここでは en-us
)を実行しようとすると発生します。具体的には:
.csproj
に<InvariantGlobalization>true</InvariantGlobalization>
が設定されている- EF Core の
Scaffold-DbContext
コマンドが内部的にカルチャ情報を必要とする - 不変モードでは
en-us
のような特定カルチャがサポートされない
根本的な解決方法
プロジェクトファイル(.csproj
)で InvariantGlobalization
プロパティを false
に設定します:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<!-- 重要: InvariantGlobalizationをfalseに設定 -->
<InvariantGlobalization>false</InvariantGlobalization>
</PropertyGroup>
</Project>
設定変更後の再起動
この変更後は、Visual Studio や CLI 環境を再起動して設定を完全に適用してください
動作原理の解説
グローバリゼーション不変モードとは
- 国際化機能を無効化する .NET の設定
- アプリのサイズ縮小やパフォーマンス向上が目的
true
設定時はCultureInfo
関連機能が制限される
Scaffold-DbContext との関係
- データベース接続時にシステムカルチャを取得しようとする
InvariantGlobalization=true
だとカルチャ情報が取得不可en-us
など特定カルチャを要求すると例外が発生
注意すべきトレードオフ
パフォーマンスと機能のバランス
- 国際化が必要ないアプリ:
true
のままが理想的 - データベースScaffoldingが必要:一時的に
false
に変更
応用的なトラブルシューティング
方法1:プロジェクト設定の階層を確認
複数の <PropertyGroup>
がある場合、設定が上書きされていないか確認
<!-- 他のPropertyGroupをチェック -->
<PropertyGroup>
<Configuration>Debug</Configuration>
<!-- ここで間違って上書きされる可能性あり -->
</PropertyGroup>
方法2:グローバルな実行設定の変更
CLI で一時的に無効化する方法(プロジェクト変更できない場合):
export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=0 # Linux/macOS
set DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=0 # Windows
dotnet ef dbcontext scaffold ...
方法3:ランタイムオプションの使用
runtimeconfig.template.json
ファイルで設定:
{
"configProperties": {
"System.Globalization.Invariant": false
}
}
ベストプラクティス
Scaffolding時のみ設定変更
- 通常運用時は
InvariantGlobalization=true
推奨 - Scaffolding後に設定を戻すことで最適化維持
- 通常運用時は
マルチステージビルドの活用
dockerfile# ビルドステージ(Scaffolding用) FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=0 RUN dotnet ef dbcontext scaffold... # 本番イメージ(最適化設定) FROM mcr.microsoft.com/dotnet/aspnet:8.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
CI/CDパイプラインでの対応
yaml- name: Scaffold DbContext env: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 0 run: dotnet ef dbcontext scaffold...
:::success 変更の確認方法 設定が正しく適用されたか確認するには:
dotnet build /property:InvariantGlobalization=false
:::
この設定変更により、Scaffold-DbContext
コマンドはカルチャ情報を正常に取得できるようになり、EF Coreのデータベースリバースエンジニアリングが正しく動作します。