EF6保存decimal至SQL Server时小数位丢失,求解决(区域文化问题)
解决ASP.NET Core MVC中Decimal属性因区域文化导致的数值解析错误
问题原因
荷兰区域文化(nl-NL)默认使用逗号作为小数分隔符,而你输入时采用了美式的点分隔符,ASP.NET Core默认模型绑定会按照服务器区域文化解析数值,导致4.4被错误识别为44(点被当作千分分隔符忽略,自动补0作为小数位)。
解决方案
1. 全局设置应用默认区域为美式英语(en-US)
在Program.cs中配置请求本地化,强制整个应用使用en-US文化处理数值解析:
// 配置支持的文化列表 builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("en-US"), // 可选:保留荷兰语作为UI显示文化 new CultureInfo("nl-NL") }; options.DefaultRequestCulture = new RequestCulture("en-US"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); // 启用本地化中间件(需放在UseRouting之后、UseAuthorization之前) app.UseRequestLocalization();
2. 针对单个模型属性指定解析文化
如果不想全局修改区域设置,可在Driver模型的decimal属性上添加特性,强制该属性使用en-US文化解析:
public class Driver { public int Id { get; set; } [Key] public string driverName { get; set; } [BindProperty(Culture = "en-US")] [DisplayFormat(DataFormatString = "{0:F1}", ApplyFormatInEditMode = true)] public decimal driverScore { get; set; } [BindProperty(Culture = "en-US")] [DisplayFormat(DataFormatString = "{0:F1}", ApplyFormatInEditMode = true)] public decimal employedTime { get; set; } // ... 其他属性 ... [BindProperty(Culture = "en-US")] [DisplayFormat(DataFormatString = "{0:F1}", ApplyFormatInEditMode = true)] public decimal lastEvaluated { get; set; } // ... 其他属性 ... }
3. 验证EF6的数据库列配置
确保数据库中对应的decimal列确实是decimal(18,1)类型:
- 检查迁移文件是否正确生成了列类型配置
- 若迁移未生效,重新生成并更新数据库:
Add-Migration FixDecimalColumnType Update-Database
4. 前端输入优化
在表单输入框中指定类型和语言属性,帮助浏览器正确处理数值输入:
<input type="number" step="0.1" lang="en" asp-for="driverScore" class="form-control" />
总结
优先使用全局区域配置,能一次性解决所有数值类型的解析问题;若需保留部分区域特性,再针对单个属性或页面做单独设置。
内容的提问来源于stack exchange,提问作者Bram
相关产品推荐
相关产品推荐

