PetaPoco描述
PetaPoco是一个微小的,快速的,单个文件的微型ORM,可以运行在.NET和Mono平台上。相对于NHibernate与Entity Framework,PetaPoco有以下几点非常吸引我:
PetaPocoRepository 仓储基类
Add,Delete,Update,Save,FirstOrDefault(获取一条),Query(获取列表),PagedList(获取分页)等。
SingleRepository 单个数据库模式的仓储基类
系统中存在多个数据库时,如果我们使用SqlHelper类似的组件来进行编码时,可能不是很优雅,类似于:
其实,我们可以通过封装一个基类,通过某个特性来说明此业务对象仓储操作类对应的是哪个数据库。它有以下需求:
1. 最好能继承PetaPocoRepository,得到其所有通用性的数据操作方法;
2. 特性来描述该对象操作的是哪个数据库;
OK,直接上图:
使用
示例环境:
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"/>
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