You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:27:02