0

0

Dapper如何映射到只读属性 Dapper Readonly Property映射

星降

星降

发布时间:2025-12-14 09:07:16

|

701人浏览过

|

来源于php中文网

原创

Dapper 默认不映射只读属性,但可通过构造函数参数匹配、启用非公共成员访问或自定义 TypeMap 实现映射;推荐使用构造函数方式,要求 SQL 列名与参数名严格一致。

dapper如何映射到只读属性 dapper readonly property映射

Dapper 默认只映射 public set 的属性,遇到只读属性(比如 public string Name { get; }private set)时,不会自动赋值。但可以通过几种方式实现映射,关键是让 Dapper 知道“这个字段要写进去”,即使 setter 不公开。

用构造函数参数匹配字段名

Dapper 支持通过构造函数注入完成只读属性初始化。只要 SQL 查询列名和构造函数参数名完全一致(大小写敏感),Dapper 就会用该参数创建对象。

  • 实体类需定义含参构造函数,参数名与数据库字段/别名严格对应
  • 属性声明为只读(get;)或私有 setter(get; private set;)均可
  • 查询时使用 Query(),Dapper 自动绑定构造参数

示例:

public class Product
{
    public int Id { get; }
    public string Name { get; }
    public decimal Price { get; }
public Product(int id, string name, decimal price)
{
    Id = id;
    Name = name;
    Price = price;
}

}

SQL 查询必须用别名对齐参数名:SELECT Id, Name, Price FROM Products

启用非公共成员访问(.NET Core/.NET 5+)

Dapper 在较新版本中支持通过配置开启非公共属性写入。需在应用启动时设置:

Higgsfield
Higgsfield

电影级AI视频生成工具

下载
  • 调用 Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;(可选,用于下划线转驼峰)
  • 关键一步:设置 Dapper.SqlMapper.SetTypeMap 或启用 UseConstructorBinding = false 并配合反射权限
  • 更直接的方式:在 Query() 前临时启用私有 setter 赋值

实际常用做法是添加一行初始化代码(仅需一次):

Dapper.SqlMapper.AddTypeMap(typeof(Product), 
    new CustomPropertyTypeMap(typeof(Product), 
        (type, columnName) => type.GetProperties()
            .FirstOrDefault(p => p.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase))));

用 Dapper.Contrib 的 [Write(false)] + 私有字段回填

如果你用的是 Dapper.Contrib 扩展包,它本身不支持只读属性,但可以反向操作:把值先写进私有字段,再由只读属性读取。

  • 给类加 [Table("Products")] 特性
  • [ExplicitKey] 标识主键,其他字段保持 private set
  • 查询仍用原生 Query(),不走 Contrib 的 GetAsync 方法(它依赖 public set)

也就是说:Contrib 适合增删改,只读映射推荐回归原生 Dapper + 构造函数方案。

避免踩坑的细节提醒

  • 字段名和属性名不一致时,SQL 中一定要用 AS 显式别名,否则构造函数绑定失败
  • 若属性是 get; init;(C# 9+),Dapper 默认支持,无需额外配置
  • 异步方法如 QueryFirstOrDefaultAsync() 同样适用上述所有方式
  • 不要依赖 [ReadOnly(true)] 这类自定义特性——Dapper 不识别它们

基本上就这些。构造函数方式最稳定,也最符合领域模型封装原则。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

686

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1117

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

737

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

20

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 50.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号