.NET 8 Web API使用Entity Framework Core取数时出现全球化不变模式错误
问题描述
我创建了一个示例复现错误:搭建ASP.NET Core 8 Web API,创建实体类TableExample:
using System.ComponentModel.DataAnnotations.Schema; namespace api { [Table("A")] public class TableExample { [Column("Example")] public int ColumnExample { get; set; } } }
数据库中有一张名为A的表,包含Example列。DbContext类代码:
using Microsoft.EntityFrameworkCore; namespace api { public class Context : DbContext { public DbSet<TableExample> TableExamples { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Data Source=datasource;Initial Catalog=database;Trusted_Connection=true;MultipleActiveResultSets=true;TrustServerCertificate=True"); base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } } }
控制器中获取数据的代码:
using Microsoft.AspNetCore.Mvc; namespace api.Controllers { [ApiController] [Route("[controller]")] public class WeatherForecastController : Controller { [HttpGet(Name = "GetWeatherForecast")] public IActionResult Get() { Context context = new Context(); var test = context.TableExamples.ToList(); return View(); } } }
运行API时触发错误:Only the invariant culture is supported in globalization-invariant(错误截图:
)。
但将相同的类放到控制台应用中(Program.cs代码如下),运行完全正常:
using api; namespace ConsoleApp1 { internal class Program { static void Main(string[] args) { Context context = new Context(); var teste = context.TableExamples.ToList(); } } }
已知需要将Globalization.Invariant设为false,但我的launchSettings.json中没有相关配置,文件内容如下:
{ "$schema": "http://json.schemastore.org/launchsettings.json", "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:35135", "sslPort": 44348 } }, "profiles": { "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:5024", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "https": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "https://localhost:7164;http://localhost:5024", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "swagger", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
如何修正API中的这个错误?
解决方案
方法1:修改项目文件(.csproj)
在项目的.csproj文件中添加以下配置,禁用全球化不变模式:
<PropertyGroup> <InvariantGlobalization>false</InvariantGlobalization> </PropertyGroup>
方法2:在launchSettings.json中添加环境变量
在每个profile的environmentVariables节点下添加DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false,以http profile为例:
"http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:5024", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "DOTNET_SYSTEM_GLOBALIZATION_INVARIANT": "false" } }
需要对https和IIS Express profile做同样的修改。
方法3:修改runtimeconfig.json
如果项目已经生成,找到输出目录中的[项目名].runtimeconfig.json文件,添加configProperties配置:
{ "runtimeOptions": { "configProperties": { "System.Globalization.Invariant": false } } }
补充说明
控制台应用正常是因为默认没有启用全球化不变模式,而ASP.NET Core项目可能因为某些发布配置或环境默认开启了该模式。上述方法任选其一即可解决问题,推荐优先使用方法1或方法2,便于项目统一管理。
内容的提问来源于stack exchange,提问作者Sil_2
相关产品推荐
相关产品推荐

