Skip to content

Scaffold-DbContext 実行時の CultureNotFoundException エラーの解決

環境固有のエラー

.NET 7/8 で Scaffold-DbContext を実行中に以下のエラーが発生する場合:

text
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)を実行しようとすると発生します。具体的には:

  1. .csproj<InvariantGlobalization>true</InvariantGlobalization> が設定されている
  2. EF Core の Scaffold-DbContext コマンドが内部的にカルチャ情報を必要とする
  3. 不変モードでは en-us のような特定カルチャがサポートされない

根本的な解決方法

プロジェクトファイル(.csproj)で InvariantGlobalization プロパティを false に設定します:

xml
<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 との関係

  1. データベース接続時にシステムカルチャを取得しようとする
  2. InvariantGlobalization=true だとカルチャ情報が取得不可
  3. en-us など特定カルチャを要求すると例外が発生

注意すべきトレードオフ

パフォーマンスと機能のバランス

  • 国際化が必要ないアプリ:true のままが理想的
  • データベースScaffoldingが必要:一時的に false に変更

応用的なトラブルシューティング

方法1:プロジェクト設定の階層を確認

複数の <PropertyGroup> がある場合、設定が上書きされていないか確認

xml
<!-- 他のPropertyGroupをチェック -->
<PropertyGroup>
  <Configuration>Debug</Configuration>
  <!-- ここで間違って上書きされる可能性あり -->
</PropertyGroup>

方法2:グローバルな実行設定の変更

CLI で一時的に無効化する方法(プロジェクト変更できない場合):

bash
export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=0 # Linux/macOS
set DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=0    # Windows
dotnet ef dbcontext scaffold ...

方法3:ランタイムオプションの使用

runtimeconfig.template.json ファイルで設定:

json
{
  "configProperties": {
    "System.Globalization.Invariant": false
  }
}

ベストプラクティス

  1. Scaffolding時のみ設定変更

    • 通常運用時は InvariantGlobalization=true 推奨
    • Scaffolding後に設定を戻すことで最適化維持
  2. マルチステージビルドの活用

    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
  3. CI/CDパイプラインでの対応

    yaml
    - name: Scaffold DbContext
      env:
        DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 0
      run: dotnet ef dbcontext scaffold...

:::success 変更の確認方法 設定が正しく適用されたか確認するには:

bash
dotnet build /property:InvariantGlobalization=false

:::

この設定変更により、Scaffold-DbContext コマンドはカルチャ情報を正常に取得できるようになり、EF Coreのデータベースリバースエンジニアリングが正しく動作します。