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;
关键修正点
- 简化SplitOn参数:只拆分到
ActuarialFirm,后续所有用户相关字段统一作为一个动态对象处理,避免重复拆分键导致的映射失败 - 正确提取属性值:直接通过动态对象的属性名访问字段实际值,替代错误的反射调用(之前的代码获取的是
PropertyInfo对象而非数据值,这是数据为null的核心原因) - 避免冗余拆分:不需要为每个
User单独拆分类型,SQL返回的是扁平化字段集合,并非独立的用户对象结构
额外建议
如果存储过程返回的列名不够清晰,建议修改存储过程,给每个用户的字段加上明确前缀(如CERT_、PRIMARY_),确保和User模型的属性对应关系一目了然,减少映射错误。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

