新闻中心

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

2025-12-14
浏览次数:
返回列表
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<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

Glean是一个专为企业团队设计的AI搜索和知识发现工具

Glean 210 查看详情 Glean
  • 调用 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:递归比较文件夹内容并找出特定类型文件的差异 

搜索