如何在ASP.NET Core+SQL Server场景下使用Dapper正确读取DateTime值
问题根因
该问题由Dapper字段映射不匹配导致:
插入数据时你手动在SQL中指定了created_at字段对应@CreatedAt参数,所以写入逻辑正常,数据库中存储的时间值正确;但查询时直接使用select *返回的数据库列名为下划线格式的created_at,无法和C#模型中帕斯卡命名的CreatedAt属性自动匹配,导致属性未被赋值,保留了DateTime类型的默认值0001-01-01T00:00:00。
解决方案
你可以根据场景选择以下任意一种方案解决:
- 方案1:修改查询SQL加字段别名
调整查询语句,给时间字段加别名对齐模型属性名,改动最小立即可生效:select id, username, email, password, created_at as CreatedAt from users where id = @Id - 方案2:全局开启下划线自动映射
在项目启动代码(比如.NET 6+的Program.cs)中添加全局配置,一次配置后所有下划线命名的数据库字段都能自动匹配对应帕斯卡命名的C#属性:Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true; - 方案3:显式标注字段映射关系
给User类的CreatedAt属性加Column特性,手动指定对应的数据库字段名:
该方案适合仅需处理个别字段映射不匹配的场景。using System.ComponentModel.DataAnnotations.Schema; public class User { [Column("created_at")] public DateTime CreatedAt { get; set; } }
内容的提问来源于stack exchange,提问作者TommyTheReal
相关产品推荐
相关产品推荐

