轻量级ORM-PetaPoco及改进

作者:帮助您   发布:2013-04-26 06:03   分类:软件综合问题   阅读:371次   评论关闭  
 

PetaPoco描述

PetaPoco是一个微小的,快速的,单个文件的微型ORM,可以运行在.NET和Mono平台上。相对于NHibernate与Entity Framework,PetaPoco有以下几点非常吸引我:

  1. 1. 轻量级,高性能;
  2. 2. 可同时运行在.net与mono平台上;
  3. 3. 支持多种数据库,且按其提供的规范编写组装SQL,切换数据库时,基本上不需要修改代码;
  4. 4. SqlBuilder高效快捷方便;
  5. PetaPoco地址:http://www.toptensoftware.com/petapoco/
  6. 如何使用PetaPoco,PetaPoco有非常详细的使用指南,园子里面也有同学翻译了:传送门
  7. 下面,主要分享一下我对它的一些小改造

PetaPocoRepository 仓储基类

  1. PetaPocoRepository主要通过一个泛型仓储基类来封装PetaPoco的大多数数据操作。简化业务对象仓储操作类的开发。
  2. 主要有以下操作:

Add,Delete,Update,Save,FirstOrDefault(获取一条),Query(获取列表),PagedList(获取分页)等。

  1. 代码片段:      
  2. 在相对较为复杂的业务系统中,可能存在多个数据库,例如:UserDB,ProductDB,OrderDB等。且存在UserDB数据量较大,需要上Oracle数据库,而其他数据库有可能是SqlServer或MySql;
  3. 即一个业务系统中,存在多个数据库,多种数据库。
  4. 面对这样的业务系统时,我们需要对数据层进行较好地封装,而PetaPoco的Sql Builder无缝兼容多种数据库能很好地解决异构数据库的问题。因此,我们只需要解决多个数据库带来的编码困难。

SingleRepository 单个数据库模式的仓储基类

系统中存在多个数据库时,如果我们使用SqlHelper类似的组件来进行编码时,可能不是很优雅,类似于:     

其实,我们可以通过封装一个基类,通过某个特性来说明此业务对象仓储操作类对应的是哪个数据库。它有以下需求:

1. 最好能继承PetaPocoRepository,得到其所有通用性的数据操作方法;

2. 特性来描述该对象操作的是哪个数据库;

OK,直接上图:

SingleDbFactory

SingleRepository<T>

使用

示例环境:

1. 存在2个数据库:TestDB(SqlServer),Test(MySql);

2. TestDB(SqlServer)中存在2个表UserInfo,ProductId,Test(MySql)中存在表UserInfo

3. 数据库连接字符串

<add name=”SqlServerDB” connectionString=”Server=.\SqlExpress;Database=TestDB;Integrated Security=SSPI;” providerName=”System.Data.SqlClient“/>         <add name=”MySqlDB” connectionString=”Server=127.0.0.1;Database=Test;Uid=root;Pwd=123456;” providerName=”MySql.Data.MySqlClient“/>

4. 仓储类     

5. 类图

通过SingleDbFactory特性的描述,即可较为优雅地实现数据操作类对应不同数据库。

MySql / SqlServer 多种数据库的支持

上面的示例中,TestDB(SqlServer)及Test(MySql)中都存在表UserInfo。当我们从SqlServer切换至MySql时,只需要UserInfoRepository中的SQL语句使用SqlBuilder类来进行规范的组装,完全可以无缝兼容。(只需要修改SingleDbFactory即可,在本文最后会附上示例代码。)

需要探讨的问题

1. 当某个业务对象在一个数据库内进行表水平拆分时,组件需要如何应对。这个想了很久,最开始,我也想通过一个SingleSharddingRepository来实现。碰到了一些困难,如:

Shardding时的规则多样化,怎样通过代码注入的方式来定义规则;         

                    大量使用反射或AOP时,性能会不会有影响;

2. 当某个业务对象进行数据库级别的水平拆分时,组件需要如何应对。

非常希望园子里的高手给出较好的建议

DEMO下载地址:http://files.cnblogs.com/bagegejin/PetaPocoDemo.rar

原创文章,转载请注明: 转载自帮助您

本文链接地址: 轻量级ORM-PetaPoco及改进

[转载]ORM-PetaPoco 小型ORM框架的更多相关文章

  1. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  2. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...

  3. Mini ORM——PetaPoco笔记

    Mini ORM--PetaPoco笔记 记录一下petapoco官网博客的一些要点.这些博客记录了PetaPoco是如何一步步改进的. 目录: Announcing PetaPoco PetaPoc ...

  4. Dapper小型ORM的使用(随便吐槽下公司)

    近来公司又有新项目要做,之前做项目用过蛮多ORM,包括ef,NetTiers,ServiceStack.OrmLite等ROM,每种ORM都有一定的坑(或者说是使用者的问题吧~~).用来用去都觉的有一 ...

  5. 轻量级ORM——PetaPoco

    近乎产品的数据访问是基于轻量级ORM——PetaPoco,哪怕是最新的5.2版本也是基于PetaPoco. 产品源码下载地址:http://www.jinhusns.com/Products/Down ...

  6. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  7. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  8. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  9. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  10. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

随机推荐

  1. PTA(Basci Level)1043.输出PATest

    给定一个长度不超过 104 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已 ...

  2. JS对字符串的操作,截取

    substring()  //一个参数的时候是从那个参数到字符串结束的位置: substring(start,stop)        //substring是对字符串两个索引之间的值进行截取: 要注 ...

  3. Vue ---- Vuex 的第一次接触

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...

  4. emacs 常用命令

    C stands for Ctrl and M stands for Alt  REFERENCE FORM EMACS TUTORIAL 表述不一定正确,仅供参考,主要是要多实践,一开始可能会不习惯 ...

  5. storm drpc分布式本地和远程调用模式讲解

    一.drpc 的介绍 1.rpc RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 2.drpc drp ...

  6. mysql导入数据报错:Incorrect datetime value

    incorrect datetime value 报错信息如下图: 意思很明显是说,'0000-00-00 00:00:00'不是一个有效的日期类型的值 解决办法: sql_mode 中删除 NO_Z ...

  7. Elasticsearch使用小结之冷热分离

    Elasticsearch使用小结之冷热分离 索引迁移 索引setting中的index.routing.allocation.exclude和index.routing.allocation.inc ...

  8. 【LOJ】#3096. 「SNOI2019」数论

    LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\) ...

  9. docker启动mysql 自定义配置文件

    命令行如下: docker run --name mysql56 -p : -v /home/mysql56/data:/var/lib/mysql -v /home/mysql56/conf:/et ...

  10. .net Core 图片验证码 基于SkiaSharp实现

    public class ImageCaptcha { /// <summary> /// 干扰线的颜色集合 /// </summary> private List<SK ...