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
相关产品推荐
相关产品推荐

