Dapper是近2年异军突起的新ORM工具,它有ado.net般的高性能又有反射映射实体的灵活性,非常适合喜欢原生sql的程序员使用,而且它源码很小,十分轻便。我写本博客的目的不是为了介绍Dapper,而是要将我使用Dapper迁移数据库过程中遇到的bug和一些优化介绍给大家,Dapper在多数据库支持上有些问题,我做了以下5个方面的优化。
一:Dapper核心库存在一个重要的bug是各数据库默认返回类型不同造成的,像count,sum等一些函数在不同的数据库返回类型不同。比如 select count(1) from Table; sqlserver返回值类型是int,oracle是decimal,mysql是long。那么
connection.Query<int>("select count(*) from Table ");
这条语句运行在sqlserver下没问题,其他数据库会因为类型不匹配报错。同样的,Dapper要求实体对象的类型必须严格的与数据库类型一一对应(主要是出现在int,byte和enum类型上)。解决的办法是将强制转换类型改为通用转换,把Dapper代码中的这句
return val is DBNull ? null : val;
改为:
return val is DBNull ? null : Convert.ChangeType(val, type);
二:没有提供参数前缀转换的功能,这点可以在SetupCommand方法中自行写方法替换。
三:Dapper只提供最基本的orm框架,对增删改没有提供简便的方法,Dapper扩展类就是提供这类功能的,但此扩展类存在一个不足:增改时会将实体所有字段都拼接到sql中,无法只增改部分字段,把nullable类型的字段当做普通字段处理。这里我进行了优化:拼接sql时判断字段的值是否为空,为空的字段不做处理。
四:官方的Dapper扩展类参数前缀用的是"@",这不符合规范,改为通过IDbConnection类型判断加前缀。
五:添加各数据库通用分页方法及TOP方法。
做这么多优化目的只有一个:能够无缝的迁移数据库。如果你一直就用sqlserver的话,大可不必修改,附:源码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库