解决 EF Core Scaffold-DbContext 的全球化错误
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
命令生成数据库模型时,常常会遇到以下错误:
Scaffold-DbContext "connection string" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities
该错误通常表现为以下信息:
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)会导致异常。
错误原因详解
.NET
项目的InvariantGlobalization
配置为true
- 在此模式下仅支持不变区域性(invariant culture)
Scaffold-DbContext
内部操作尝试访问系统区域设置- EF Core 在建立数据库连接时调用了区域性相关方法
重要提示
即使您已在项目中添加了 <InvariantGlobalization>true</InvariantGlobalization>
,此错误仍会出现
解决方案
修改项目文件(.csproj)中的 InvariantGlobalization
设置:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- 确保此值设置为false -->
<InvariantGlobalization>false</InvariantGlobalization>
</PropertyGroup>
</Project>
操作步骤
- 打开项目文件(.csproj)
- 在
<PropertyGroup>
部分添加或修改设置 - 保存并重新运行脚手架命令
支持的环境版本
.NET 版本 | 是否支持此方案 |
---|---|
.NET 7 | ✅ 确认有效 |
.NET 8 | ✅ 确认有效 |
.NET 6 | ⚠️ 部分有效 |
原理分析
全局化不变模式的影响
全球化不变模式 (
InvariantGlobalization=true
)- 移除了所有本地化数据
- 禁用 CultureInfo 相关功能
- 仅支持不变区域性(culture-invariant)
EF Core 脚手架依赖关系
- 需要访问区域性设置来映射 SQL Server 数据类型
- 尝试获取默认区域性(通常为 en-US)
- 在不变模式下找不到对应区域性
为何设置为 false
有效
// EF Core 内部简化代码展示
SqlConnection.Open() {
var culture = CultureInfo.GetCultureInfo("en-US"); // 此处抛出异常
// 执行数据库操作...
}
✅ 将 InvariantGlobalization
设为 false
后:
- .NET 运行时加载完整全球化数据
- CultureInfo 调用能正常返回区域设置
- EF Core 顺利完成数据库连接和模型生成
其他注意事项
容器环境配置
docker# Dockerfile 中需要安装必要组件 RUN apt-get update && \ apt-get install -y locales && \ locale-gen en_US.UTF-8
命令行临时解决方案
powershell# 临时设置环境变量 $env:DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = "0" Scaffold-DbContext "Server=..." Microsoft.EntityFrameworkCore.SqlServer
部署环境特殊处理
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
错误。此解决方案适用于:
- 需要本地化支持的开发环境
- 数据库建模阶段
- 与 SQL Server 交互的项目场景