Petapoco 連接oracle11g 自動生成poco時遇到的問題
偶爾在園子里看到.net的輕量級ORM框架Petapoco的介紹,覺得很有趣。相關介紹:PetaPoco:適用于.NET的微型ORM
正好最近有個C#+Oracle11g的項目,想趁此機會試試用petapoco來做數(shù)據(jù)層的框架。
在配置步驟和遇到的問題,記錄如下。
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后出現(xiàn)了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#明明已經(jīng)可以連上oracle并取得數(shù)據(jù)了,為什么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了,折騰了好長時間,試了網(wǎng)上的好多方法,總算找到原因了(machine.config的問題)。
對于"Failed to read database schema”,我覺得可能是Database.tt在Oracle11g上的一個bug。
修改起來也很簡單,只要注釋掉PetaPoco.Core.ttinclude中的兩行即可。(大約是1164和1165行)
通過調試,發(fā)現(xiàn)上圖中取出的rdr中并沒有["TABLE_SCHEMA"]和["TABLE_TYPE"]的信息,所以生成poco時報錯了。
將上面兩行注釋掉就可以生成poco了。
生成poco后,可以利用petapoco提供API,方便的操作數(shù)據(jù)庫了。具體使用方法可以參考http://www.toptensoftware.com/petapoco/
PS. PetaPoco確實輕量,沒有任何dll,只有一個PetaPoco.cs的源碼文件。如果對性能要求比較苛刻,但又想使用ORM,那么PetaPoco是個很好的選擇。
據(jù)說它的性能還能進一步提升,希望大家能關注一下它。









浙公網(wǎng)安備 33010602011771號