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

Dapper 默认只映射 public set 的属性,遇到只读属性(比如 public string Name { get; } 或 private set)时,不会自动赋值。但可以通过几种方式实现映射,关键是让 Dapper 知道“这个字段要写进去”,即使 setter 不公开。
用构造函数参数匹配字段名
Dapper 支持通过构造函数注入完成只读属性初始化。只要 SQL 查询列名和构造函数参数名完全一致(大小写敏感),Dapper 就会用该参数创建对象。
- 实体类需定义含参构造函数,参数名与数据库字段/别名严格对应
- 属性声明为只读(
get;)或私有 setter(get; private set;)均可 - 查询时使用
Query<t>()</t>,Dapper 自动绑定构造参数
示例:
public class Product
{
public int Id { get; }
public string Name { get; }
public decimal Price { get; }
<pre class='brush:php;toolbar:false;'>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 在较新版本中支持通过配置开启非公共属性写入。需在应用启动时设置:

Glean
Glean是一个专为企业团队设计的AI搜索和知识发现工具
210
查看详情
- 调用
Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;(可选,用于下划线转驼峰) - 关键一步:设置
Dapper.SqlMapper.SetTypeMap或启用UseConstructorBinding = false并配合反射权限 - 更直接的方式:在
Query<t>()</t>前临时启用私有 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<t>()</t>,不走 Contrib 的GetAsync方法(它依赖 public set)
也就是说:Contrib 适合增删改,只读映射推荐回归原生 Dapper + 构造函数方案。
避免踩坑的细节提醒
- 字段名和属性名不一致时,SQL 中一定要用
AS显式别名,否则构造函数绑定失败 - 若属性是
get; init;(C# 9+),Dapper 默认支持,无需额外配置 - 异步方法如
QueryFirstOrDefaultAsync<t>()</t>同样适用上述所有方式 - 不要依赖
[ReadOnly(true)]这类自定义特性——Dapper 不识别它们
基本上就这些。构造函数方式最稳定,也最符合领域模型封装原则。
以上就是Dapper如何映射到只读属性 Dapper Readonly Property映射的详细内容,更多请关注其它相关文章!
# 下划线
# 推广网站有前途吗吗贴吧
# 网站功能建设流程图
# 保定seo排名工具
# 静海seo优化推广
# 公司推广需要做网站
# 市场营销策划与品牌推广PDF
# 拼多多网站推广哪个好点
# 营销推广策划是什么意思
# 娄底网站建设收益
# 培训机构网站建设推广
# 推荐使用
# app
# 字段名
# 分片
# 是一个
# 客户端
# 的是
# 重试
# 绑定
# 自定义
# .net
# c#
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
德邦快递查询平台 德邦快递物流信息查询入口
抖音网页版怎么|直播|_抖音网页版开播操作指南
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
如何更改在 Excel 中打开超链接时的默认浏览器
《刺客信条:影》PS5 Pro和Switch 2画面对比
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站
解决Tabulator日期时间排序问题的专业指南
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
React列表渲染与独立状态管理:避免全局状态影响局部更新
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项
qq游戏手机版下载安装_qq游戏移动端入口
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
58动漫网在线官方网 58动漫网正版动漫入口网址
美团外卖商家服务中心入口 美团商家版官网入口
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
内存检查:在VS Code中调试C++时的内存视图
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
海量存储:机器视觉智能化的核心基石
解决Python logging 中 datefmt 导致时间戳固定不变的问题
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
优化Django表单:提交验证失败后保留用户输入
sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
yandex入口引擎手机版 yandex安卓版下载入口
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
FullCalendar 自定义按钮样式定制指南
Go语言JSON解析深度指南:动态访问与结构体映射实践
msn官网入口地址手机版 msn官方网站手机最新链接
如何将HTML表格多行数据保存到Google Sheet
J*aScript Promise链中如何正确终止后续.then执行并处理错误
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
mc.js免安装版 mc.js一键畅玩入口
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
在哪找SublimeJ远程工具_SFTP插件配置教程
《噬血代码2》新预告片发布 展示游戏剧情
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
Python:递归比较文件夹内容并找出特定类型文件的差异


2025-12-14
浏览次数:次
返回列表