新闻中心

Dapper.FluentMap是什么 Dapper.FluentMap流畅映射配置教程

2025-12-14
浏览次数:
返回列表
Dapper.FluentMap 是一个为 Dapper 设计的轻量级编译期映射配置库,通过 Fluent API 在启动时注册列名映射规则,解决数据库下划线命名、字段前缀/后缀、审计字段忽略及统一约定等场景,需在首次查询前完成 Initialize 初始化。

dapper.fluentmap是什么 dapper.fluentmap流畅映射配置教程

Dapper.FluentMap 是什么

Dapper.FluentMap 是一个为 Dapper 设计的轻量级映射配置扩展库,用于解决“数据库列名与 C# 属性名不一致”时的手动映射问题。它不改变 Dapper 的核心行为,也不引入运行时反射开销,而是通过编译期友好的 Fluent API,在应用启动时一次性注册映射规则,让 Dapper 知道“哪个属性对应哪一列”或“哪些属性该忽略”。

它特别适合这些场景: - 数据库用下划线命名(user_name)而实体用 PascalCase(UserName) - 表字段含前缀(如 tbl_user_id)或后缀(如 created_dt) - 某些字段纯属审计列(updated_by, is_deleted),不想映射进实体 - 需要统一约定(比如所有 Id 属性都映射到 autID)而不逐个写 SQL 别名

基础映射配置步骤

User 实体为例,假设数据库表字段是 usr_idusr_nameusr_email,而 C# 类是:

public class User { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } }

你需要:

  • 创建映射类,继承 EntityMap<user></user>
  • 在构造函数中用 Map() 显式指定列名,或用 Ignore() 跳过字段
  • 在程序启动时(如 Program.csStartup.ConfigureServices)调用 FluentMapper.Initialize() 注册

示例代码:

public class UserMap : EntityMap
{
  public UserMap()
  {
    Map(x => x.Id).ToColumn("usr_id");
    Map(x => x.Name).ToColumn("usr_name");
    Map(x => x.Email).ToColumn("usr_email");
  }
}

FluentMapper.Initialize(config =>
{
  config.AddMap(new UserMap());
});

忽略字段和约定式映射

如果实体里有不对应数据库列的属性(比如 FullName 计算属性),必须显式忽略,否则 Dapper 可能报错或静默跳过:

Map(x => x.FullName).Ignore();

若多个实体都有类似规则(例如所有 Id 属性都映射到带前缀的列),可用 约定(Convention) 统一处理:

  • 新建类继承 Convention
  • Properties<t>().Where(...)</t> 定位目标属性
  • 调用 Configure(c => c.HasColumnName(...)) 设置列名
  • Initialize 中用 AddConvention<yourconvention>()</yourconvention> 加载

这样比每个实体写一遍 Map 更干净,也更易维护。

注意事项和常见坑

配置生效的前提是:必须在任何 Dapper 查询执行前完成初始化。常见错误包括:

  • 映射类没在 Initialize 中注册——查询时仍按默认规则(属性名=列名)匹配
  • 忽略语句写错位置(比如放在 Map 外部)——Ignore() 必须链在 Map(x => ...) 后面
  • 使用了 Dapper.Contrib 的 CRUD 方法(如 GetAsync)但没配 KeyTable 特性——FluentMap 不影响 Contrib 的特性解析,二者需配合使用
  • 多线程环境下提前触发了 Dapper 查询——确保 FluentMapper.Initialize 在主线程或 DI 容器构建完成后再执行

基本上就这些。不复杂但容易忽略初始化时机和链式调用结构。

以上就是Dapper.FluentMap是什么 Dapper.FluentMap流畅映射配置教程的详细内容,更多请关注其它相关文章!


# 跳过  # 外国语网站建设需要  # 怎么推广游戏网站的  # 个人网站哪个好做推广呢  # 看书小说网站建设工作  # 厦门抖音seo教程  # 珠海市企业网站推广平台  # 百度营销推广网站报告  # 宜兴网站建设报价公司  # 新塘百度SEO  # 吴中区网站建设论坛  # 游戏开发  # app  # 发展趋势  # 链式  # 下划线  # 你在  # 有哪些  # 启动时  # 多线程  # 是一个  # c#  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  J*a里如何使用forEach遍历Map_Map遍历方法说明  J*aScript对象创建方式_J*aScript设计模式应用  J*aScript中安全有效地处理localStorage字符串数据  Go语言中的*string:深入理解字符串指针  yy漫画网页版官方入口_yy漫画官网登录页面链接  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  黑猫投诉统一入口官网 消费者权益保护投诉平台  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  word中如何让数字纵向排列_Word数字纵向排列方法  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  Win11怎么开启高性能模式_Windows 11电源计划优化设置  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  顺丰国际快递查询 国际件官方查询入口  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  J*aScript类型检查_j*ascript代码规范  AO3官方可用镜像 Archive of Our Own网页版最新入口  铃兰之剑为这和平的世界希里技能组及加点推荐  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  如何提高微信支付的安全性_微信支付安全防护与设置建议  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  千牛数据看板网页版_千牛数据看板网页版访问方法  从OpenAI API响应中高效提取生成文本  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  Django表单提交验证失败后保持字段值不刷新  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  红果短剧网页版官网入口 官方最新网址发布  AO3网页版最新入口合集 Archive of Our Own在线访问指南  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  J*aScript map 迭代中检测空数组元素的有效方法  LINUX怎么设置定时任务_LINUX crontab配置教程  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  如何在 Windows 11 中启动游戏手柄设置  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  知音漫客官网漫画下载_知音漫客网页版阅读记录  4399免费游戏网址入口 4399小游戏免费入口点开即玩  痛风发作了怎么办? 快速止痛和后期饮食调理  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程 

搜索