Skip to content

解决 EF Core 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.

问题描述

在使用 Entity Framework Core 的 Scaffold-DbContext 命令生成数据库模型时,常常会遇到以下错误:

powershell
Scaffold-DbContext "connection string" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities

该错误通常表现为以下信息:

log
System.Globalization.CultureNotFoundException: 
Only the invariant culture is supported in globalization-invariant mode. 
See https://aka.ms/GlobalizationInvariantMode for more information.
(Parameter 'name') en-us is an invalid culture identifier.

核心问题在于:当项目启用了 InvariantGlobalization 模式(全球化不变模式)时,EF Core 的脚手架工具尝试访问特定区域性(如 en-US)会导致异常。

错误原因详解

  1. .NET 项目的 InvariantGlobalization 配置为 true
  2. 在此模式下仅支持不变区域性(invariant culture)
  3. Scaffold-DbContext 内部操作尝试访问系统区域设置
  4. EF Core 在建立数据库连接时调用了区域性相关方法

重要提示

即使您已在项目中添加了 <InvariantGlobalization>true</InvariantGlobalization>,此错误仍会出现

解决方案

修改项目文件(.csproj)中的 InvariantGlobalization 设置:

xml
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <!-- 确保此值设置为false -->
    <InvariantGlobalization>false</InvariantGlobalization>
  </PropertyGroup>
</Project>

操作步骤

  1. 打开项目文件(.csproj)
  2. <PropertyGroup> 部分添加或修改设置
  3. 保存并重新运行脚手架命令

支持的环境版本

.NET 版本是否支持此方案
.NET 7✅ 确认有效
.NET 8✅ 确认有效
.NET 6⚠️ 部分有效

原理分析

全局化不变模式的影响

  1. 全球化不变模式 (InvariantGlobalization=true)

    • 移除了所有本地化数据
    • 禁用 CultureInfo 相关功能
    • 仅支持不变区域性(culture-invariant)
  2. EF Core 脚手架依赖关系

    • 需要访问区域性设置来映射 SQL Server 数据类型
    • 尝试获取默认区域性(通常为 en-US)
    • 在不变模式下找不到对应区域性

为何设置为 false 有效

csharp
// EF Core 内部简化代码展示
SqlConnection.Open() {
   var culture = CultureInfo.GetCultureInfo("en-US"); // 此处抛出异常
   // 执行数据库操作...
}

✅ 将 InvariantGlobalization 设为 false 后:

  • .NET 运行时加载完整全球化数据
  • CultureInfo 调用能正常返回区域设置
  • EF Core 顺利完成数据库连接和模型生成

其他注意事项

  1. 容器环境配置

    docker
    # Dockerfile 中需要安装必要组件
    RUN apt-get update && \
        apt-get install -y locales && \
        locale-gen en_US.UTF-8
  2. 命令行临时解决方案

    powershell
    # 临时设置环境变量
    $env:DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = "0"
    Scaffold-DbContext "Server=..." Microsoft.EntityFrameworkCore.SqlServer
  3. 部署环境特殊处理

    xml
    <!-- 开发环境禁用不变模式,生产开启 -->
    <InvariantGlobalization Condition="'$(Configuration)' == 'Release'">true</InvariantGlobalization>
    <InvariantGlobalization Condition="'$(Configuration)' == 'Debug'">false</InvariantGlobalization>

生产环境建议

在服务器部署时如需启用 InvariantGlobalization=true

  • 在开发环境执行脚手架操作
  • 提前生成所需模型类
  • 禁止在生产环境运行脚手架代码

结论总结

配置状态结果推荐场景
InvariantGlobalization=true脚手架失败生产环境部署
InvariantGlobalization=false脚手架成功运行开发阶段

通过将 .csproj 文件中的 <InvariantGlobalization>false</InvariantGlobalization> 设置,即可彻底解决在使用 Scaffold-DbContext 命令时出现的 CultureNotFoundException 错误。此解决方案适用于:

  1. 需要本地化支持的开发环境
  2. 数据库建模阶段
  3. 与 SQL Server 交互的项目场景