【PetaPoco】 连接Oracle

转:http://www.cnblogs.com/wang_yb/archive/2011/07/12/2104788.html

 

在园子里看到.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是个很好的选择。

     据说它的性能还能进一步提升,希望大家能关注一下它。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。