日期:2014-05-17  浏览次数:21403 次

分享一个优秀的开源ORM框架 -- petaPoco
petaPoco出现在2011年...因此老鸟可忽略该贴...目前最新版是 5.0, 但核心文件变化不大.

在众多的ORM框架中, 其中不乏非常优秀的EF, 但今天仍然想写点关于PetaPoco的文字 ... 是因为有几个项目一直在使用petaPoco, 原因有2点:
1. 轻量级, 高性能
2. 个人偏向DataBase First的开发方式, 原因在于Toad for Oracle工具创建数据库对象迅速, 各种方便, 胜过Code First模式创建类的速度.(此处抛开各种设计模式,各种理论).

------------------------------------------

开发准备:
1.通过Nuget添加 petaPoco的引用 
2.在app.config文件中加入 <connectionStrings> 节点, 并配置connectionString, providerName属性.
3.打开 DataBase.tt , 修改 ConnectionStringName,以及 Namespace , Namespace, 保存以后VS会自动执行模板文件,并生成实体类文件: DataBase.Cs

------------------------------------------

使用方法:
1.实例化:
DataBase db = new Database(ConfigurationManager.ConnectionStrings["XE"]);


2.查询:
var v = db.Fetch<cls>("")


3.增 / 改 / 删

Cls.Insert();  
cls.Update(); 
Cls.Delete();


支持事务以及多实体关联, 更详细的使用可以参考官网给出的Demo: http://www.toptensoftware.com/petapoco/

------------------------------------------

T4对Oracle支持并不好, 有比较多的Bug, 因此我把项目中遇到的Bug, 以及需要修改的地方:

1.T4实体类的Update方法 , 根据ModifiedColumns 是否为Null判断实体中是否被更新,需要修改 PetaPoco.Generator.ttinclude文件第114行, 改为 if (ModifiedColumns == null || ModifiedColumns.Count == 0) 进行判断.

2.模板所生成的所有类,主键是否为自增属性始终为true, 原因 PetaPoco.Core.ttinclude 中的OracleSchemaReader 类, LoadColumns方法中 col.IsAutoIncrement 始终为true, 改为:
col.IsAutoIncrement=col.PropertyType != "string";

3.Oracle 数据库数据类型字段允许为空, 但类型中没有自动加上"?"
修改PetaPoco.Core.ttinclude第1216行, 将"YES"改为"Y", col.IsNullable=rdr["IsNullable"].ToString()=="Y";
并在第179行, 增加 col.PropertyType !="DateTime"  判断.

其他Bug不再一一列出, 最后附上T4 模板的调试方法,方便大家遇到问题自己快速定位和优化 :
1. .ttinclude文件的第一行修改为 <#@ template language="C#" debug="true" hostspecific="True" #>
2. 在需要调试的代码片断附近加入: System.Diagnostics.Debugger.Launch();

------解决方案--------------------
我现在所做的项目中就是用的它
------解决方案--------------------
对于纯面像对象编程,还不错,比较灵活
------解决方案--------------------
很多ORM框架都是基于SQLSERVER设计的,对于Oracle、MySQL的支持都是有问题的,需要自己改。我已经改好了一个,不打算换了。对于新手,要会选择,不是见到一个分享的就拿来用,非微软的产品都难免有BUG,如果你没有能力修改BUG,还是老老实实用EF等稳定框架吧。
------解决方案--------------------
对于纯面像对象编程,还不错
------解决方案--------------------
引用:
很多ORM框架都是基于SQLSERVER设计的,对于Oracle、MySQL的支持都是有问题的,需要自己改。我已经改好了一个,不打算换了。对于新手,要会选择,不是见到一个分享的就拿来用,非微软的产品都难免有BUG,如果你没有能力修改BUG,还是老老实实用EF等稳定框架吧。

如果可以直接联系作者,我想作者本人应该很乐意给BUG的。
但是如果是微软的BUG或者封装局限,很多时候是一点办法都没有。
不过我也希望微软能少点BUG,毕竟我喜欢C#,使用着.NET。
------解决方案--------------------
我用的是dapper,也不错
------解决方案--------------------
"轻量级, 高性能"我就期待这样的。

------解决方案--------------------
有没有人测试过对mysql的支持怎么样?