天天看點

Petapoco 連接配接oracle11g 自動生成poco時遇到的問題

正好最近有個C#+Oracle11g的項目,想趁此機會試試用petapoco來做資料層的架構。

在配置步驟和遇到的問題,記錄如下。

安裝Petapoco,首先得安裝Nuget,可以通過VisualStudio2010的Extention Manager來搜尋,并安裝。

<a href="http://images.cnblogs.com/cnblogs_com/wang_yb/201107/201107122345591453.png"></a>

安裝好後,打開Tools –&gt; Library Package Manager –&gt; Package Manager Console 如下圖

<a href="http://images.cnblogs.com/cnblogs_com/wang_yb/201107/201107122346077837.png"></a>

在指令行後輸入指令: PM&gt; Install-Package petapoco就可以完成安裝。

<a href="http://images.cnblogs.com/cnblogs_com/wang_yb/201107/201107122346139967.png"></a>

安裝完後,工程裡會多出一個Models檔案夾和一些檔案。其中的Database.tt就是用來自動生成poco的T4模闆。

<a href="http://images.cnblogs.com/cnblogs_com/wang_yb/201107/201107122346172669.png"></a>

一切準備好後,就在Database.tt中填寫ConnectionStringName的名稱,然後儲存Database.tt,應該就自動生成Database.cs中的poco代碼了。

Database.tt中修改的部分

<a href="http://images.cnblogs.com/cnblogs_com/wang_yb/201107/2011071223461861.png"></a>

app.config中ConnectionStringName的配置如下:

滿以為可以很順利的生成poco代碼,結果事與願違,儲存Database.tt後出現了2個警告,Database.cs沒有生成成功。

<a href="http://images.cnblogs.com/cnblogs_com/wang_yb/201107/201107122346231485.png"></a>

警告1(上圖中選中的部分)很好改,隻要将petapoco安裝時生成的檔案PetaPoco.Core.ttinclude的第一行

&lt;#@ template language="C#v3.5" hostspecific="True" #&gt;

修改為:&lt;#@ template language="C#" hostspecific="True" #&gt;

警告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的相應資訊如下:

1

2

3

4

5

6

<code>&lt;</code><code>system.data</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>DbProviderFactories</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>add</code> <code>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"/&gt;</code>

<code>    </code><code>&lt;</code><code>add</code> <code>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" /&gt;</code>

<code>    </code><code>&lt;/</code><code>DbProviderFactories</code><code>&gt;</code>

<code>&lt;/</code><code>system.data</code><code>&gt;</code>

上面Oracle Data Provider for .NET的資訊是從~\v2.0.50727\CONFIG中的machine.config裡拷出來的。

重新開機visualstudio2010後再儲存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行)

<a href="http://images.cnblogs.com/cnblogs_com/wang_yb/201107/201107122346265822.png"></a>

通過調試,發現上圖中取出的rdr中并沒有["TABLE_SCHEMA"]和["TABLE_TYPE"]的資訊,是以生成poco時報錯了。

将上面兩行注釋掉就可以生成poco了。

PS. PetaPoco确實輕量,沒有任何dll,隻有一個PetaPoco.cs的源碼檔案。如果對性能要求比較苛刻,但又想使用ORM,那麼PetaPoco是個很好的選擇。

     據說它的性能還能進一步提升,希望大家能關注一下它。

本文轉自wang_yb部落格園部落格,原文連結:http://www.cnblogs.com/wang_yb/archive/2011/07/12/2104788.html,如需轉載請自行聯系原作者