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

Dapper多映射绑定多个User类型时遇SQL列名唯一限制问题

解决Dapper多映射多个User模型的问题

你的核心问题在于:

  • 错误地使用GetType().GetProperty()获取属性对象而非属性实际值
  • 不必要地拆分出多个object类型,导致Dapper无法正确映射后续对象(SQL返回的是扁平化字段集合,并非独立的用户对象结构)

修正方案

直接利用Dapper返回的动态对象一次性提取所有用户字段,手动实例化User模型并赋值,无需拆分多个冗余的object类型:

var certificationReviews = await connection.QueryAsync<ARMS_API.Models.CertificationReview, State, ARMS_API.Models.Program, ActuarialFirm, dynamic, ARMS_API.Models.CertificationReview>(
    "select * from dbo.A2F_DMCP_0005_BrowseTest()",
    (certReview, state, program, actuarialFirm, userFields) =>
    {
        certReview.STATE = state;
        certReview.STATE.PROGRAMS.Add(program);
        certReview.ACTUARIAL_FIRM = actuarialFirm;

        // 实例化Certifying Actuary
        certReview.ACTUARIAL_FIRM.CERTIFYING_ACTUARY.Add(new User
        {
            INTERNAL_USER_NUMBER = userFields.CERTIFYING_ACTUARY_ID,
            FIRST_NAME = userFields.CERTIFYING_ACTUARY_FIRST_NAME,
            LAST_NAME = userFields.CERTIFYING_ACTUARY_LAST_NAME
        });

        // 实例化Primary Reviewer
        certReview.PRIMARY_REVIEWER = new User
        {
            INTERNAL_USER_NUMBER = userFields.PRIMARY_ACTUARY_ID,
            FIRST_NAME = userFields.PRIMARY_ACTUARY_FIRST_NAME,
            LAST_NAME = userFields.PRIMARY_ACTUARY_LAST_NAME
        };

        // 实例化Secondary Reviewer
        certReview.SECONDARY_REVIEWER = new User
        {
            INTERNAL_USER_NUMBER = userFields.SECONDARY_ACTUARY_ID,
            FIRST_NAME = userFields.SECONDARY_ACTUARY_FIRST_NAME,
            LAST_NAME = userFields.SECONDARY_ACTUARY_LAST_NAME
        };

        // 实例化DMCP Analyst
        certReview.DMCP_ANALYST = new User
        {
            INTERNAL_USER_NUMBER = userFields.DMCP_ANALYST_ID,
            FIRST_NAME = userFields.DMCP_ANALYST_FIRST_NAME,
            LAST_NAME = userFields.DMCP_ANALYST_LAST_NAME
        };

        return certReview;
    },
    splitOn: "STATE_ID,PROGRAM_DD,ACTUARIAL_FIRM_DD"
);

return certificationReviews;

关键修正点

  1. 简化SplitOn参数:只拆分到ActuarialFirm,后续所有用户相关字段统一作为一个动态对象处理,避免重复拆分键导致的映射失败
  2. 正确提取属性值:直接通过动态对象的属性名访问字段实际值,替代错误的反射调用(之前的代码获取的是PropertyInfo对象而非数据值,这是数据为null的核心原因)
  3. 避免冗余拆分:不需要为每个User单独拆分类型,SQL返回的是扁平化字段集合,并非独立的用户对象结构

额外建议

如果存储过程返回的列名不够清晰,建议修改存储过程,给每个用户的字段加上明确前缀(如CERT_、PRIMARY_),确保和User模型的属性对应关系一目了然,减少映射错误。

内容的提问来源于stack exchange,提问作者Qiuzman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:07:11