ASP.NET调用GET方法查询PostgreSQL时部分属性返回null问题
问题原因
核心原因是Dapper字段映射不匹配,你之前排查命名问题时忽略了字段前缀的下划线:
- PostgreSQL表中对应账号密码的字段名为
_password、_user - C#模型中对应属性名为
Password、User
Dapper默认仅做大小写不敏感的名称匹配,不会自动去掉字段名前的下划线,因此查询返回的这两个字段无法绑定到模型属性,最终返回默认值null。
解决办法
以下三种方案任选其一即可:
方案1:SQL查询加别名(最快生效)
修改查询语句,给下划线前缀的字段设置和模型属性一致的别名:
public async Task<IEnumerable<Client>> GetAllClients() { var db = dbConnection(); var sql = @" SELECT id, first_name, second_name, first_last_name, second_last_name, phone, birth_date, _password AS Password, _user AS User FROM public.""Clients"" "; return await db.QueryAsync<Client>(sql, new { }); }
无需修改其他代码,仅调整当前查询即可解决问题。
方案2:模型加字段映射特性(一次修改全查询生效)
给模型的Password、User属性添加Column特性,指定映射的数据库字段名:
using System.ComponentModel.DataAnnotations.Schema; public class Client { public int Id { get; set; } public string First_Name { get; set; } public string Second_Name { get; set; } public string First_Last_Name { get; set; } public string Second_Last_Name { get; set; } public string Phone { get; set; } [DataType(DataType.Date)] public DateTime Birth_Date { get; set; } [Column("_password")] public string Password { get; set; } [Column("_user")] public string User { get; set; } }
修改后所有涉及Client模型的Dapper查询都自动匹配对应字段,无需重复加别名。
方案3:全局配置Dapper映射规则(适合全项目统一命名规则场景)
如果你的项目中大量表字段都是下划线前缀的命名风格,可以在程序启动时添加全局配置,让Dapper自动处理下划线和属性名的匹配:
// Program.cs 或者启动初始化逻辑中添加 Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
开启后Dapper会自动将_password、first_name这类带下划线的字段名,匹配到Password、First_Name这类驼峰/ Pascal命名的属性。
注意:当前逻辑跑通后建议尽快将明文密码改为哈希加盐的方式存储,避免账号安全风险。
内容的提问来源于stack exchange,提问作者Marco Rivera Serrano
相关产品推荐
相关产品推荐

