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

Dapper查询时无法从基类读取Id属性问题咨询

Dapper继承类基类属性无法赋值的解决方案

问题分析

你的代码中基类BaseClass的Id属性只有get访问器,Dapper默认不会自动遍历并映射基类的只读属性,导致查询时基类Id始终为0,而子类直接属性Value能正常赋值。

可行解决方案

1. 给基类属性添加私有setter

修改基类的Id属性,添加私有setter,Dapper可通过反射访问私有成员完成赋值:

public class BaseClass
{
     public int Id { get; private set; } // 添加私有setter
}

public class Inherited : BaseClass
{
     public double Value { get; }
}

2. 使用构造函数映射

如果不想修改属性访问器,可给基类和子类添加匹配查询字段的构造函数,Dapper会优先通过构造函数参数完成属性赋值:

public class BaseClass
{
     public int Id { get; }
     // 基类构造函数接收id参数
     public BaseClass(int id)
     {
         Id = id;
     }
}

public class Inherited : BaseClass
{
     public double Value { get; }
     // 子类构造函数接收id和value,传递给基类构造函数
     public Inherited(int id, double value) : base(id)
     {
         Value = value;
     }
}

注意查询语句返回的字段名需和构造函数参数名(大小写不敏感)对应,比如查询结果要有Id(或id)和Value(或value)字段。

3. 自定义类型映射(复杂场景)

如果前两种方法不适用,可自定义Dapper的类型映射规则,实现ITypeMap接口指定基类属性的映射逻辑,但这种方式代码量较大,仅推荐给特殊需求场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:50:28