偶尔在园子里看到.net的轻量级ORM框架Petapoco的介绍,觉得很有趣。相关介绍:PetaPoco:适用于.NET的微型ORM
正好最近有个C#+Oracle11g的项目,想趁此机会试试用petapoco来做数据层的框架。
在配置步骤和遇到的问题,记录如下。
1. 首先配置ODP.net,使得可以通过C#来连接Oracle。
配置ODP.net的方法请参考我之前的博客:C# 连接Oracle(利用ODP.net,不安装oracle客户端)
2. 安装Petapoco
安装Petapoco,首先得安装Nuget,可以通过VisualStudio2010的Extention Manager来搜索,并安装。
安装好后,打开Tools –> Library Package Manager –> Package Manager Console 如下图
在命令行后输入命令: PM> Install-Package petapoco就可以完成安装。
安装完后,工程里会多出一个Models文件夹和一些文件。其中的Database.tt就是用来自动生成poco的T4模板。
3. 利用Petapoco的Database.tt生成poco时的问题一:"Failed to load provider Oracle.DataAccess.Client”
一切准备好后,就在Database.tt中填写ConnectionStringName的名称,然后保存Database.tt,应该就自动生成Database.cs中的poco代码了。
Database.tt中修改的部分
app.config中ConnectionStringName的配置如下:
满以为可以很顺利的生成poco代码,结果事与愿违,保存Database.tt后出现了2个警告,Database.cs没有生成成功。
警告1(上图中选中的部分)很好改,只要将petapoco安装时生成的文件PetaPoco.Core.ttinclude的第一行
<#@ template language="C#v3.5" hostspecific="True" #>
修改为:<#@ template language="C#" hostspecific="True" #>
警告2就是那个"Failed to load provider Oracle.DataAccess.Client“的错误,几乎折腾了我一个晚上。
C#明明已经可以连上oracle并取得数据了,为什么T4模板生成poco时仍然说找不到Data Provider呢?
最后终于找到了原因:
原来我安装的ODP.net中的Oracle.DataAccess.dll是.net Framework2.0版本的,
因此Oracle.DataAccess相关的provider信息只在C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG中的machine.config里面有记录。
在C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config中的machine.config里面没有记录。
而我测试用的工程是针对.net Framework4.0的WPF工程,因此在C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config中的machine.config里面没有找到相应的Provider信息。
于是我将~\v2.0.50727\CONFIG中的machine.config里面的Oracle.DataAccess相关的provider信息拷入~\v4.0.30319\Config中的machine.config的相应位置。
我的~\v4.0.30319\Config中的machine.config的相应信息如下:
<system.data> <DbProviderFactories> <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data>
上面Oracle Data Provider for .NET的信息是从~\v2.0.50727\CONFIG中的machine.config里拷出来的。
重启visualstudio2010后再保存Database.tt来生成poco。
警告变成了下面的"Failed to read database schema”
4. 利用Petapoco的Database.tt生成poco时的问题二:"Failed to read database schema”
Petapoco的T4模板总算可以连上oracle了,折腾了好长时间,试了网上的好多方法,总算找到原因了(machine.config的问题)。
对于"Failed to read database schema”,我觉得可能是Database.tt在Oracle11g上的一个bug。
修改起来也很简单,只要注释掉PetaPoco.Core.ttinclude中的两行即可。(大约是1164和1165行)
通过调试,发现上图中取出的rdr中并没有["TABLE_SCHEMA"]和["TABLE_TYPE"]的信息,所以生成poco时报错了。
将上面两行注释掉就可以生成poco了。
生成poco后,可以利用petapoco提供API,方便的操作数据库了。具体使用方法可以参考http://www.toptensoftware.com/petapoco/
PS. PetaPoco确实轻量,没有任何dll,只有一个PetaPoco.cs的源码文件。如果对性能要求比较苛刻,但又想使用ORM,那么PetaPoco是个很好的选择。
据说它的性能还能进一步提升,希望大家能关注一下它。