• Petapoco 连接oracle11g 自动生成poco时遇到的问题


    偶尔在园子里看到.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来搜索,并安装。

    image

    安装好后,打开Tools –> Library Package Manager –> Package Manager Console 如下图

    image

    在命令行后输入命令: PM> Install-Package petapoco就可以完成安装。

    image

    安装完后,工程里会多出一个Models文件夹和一些文件。其中的Database.tt就是用来自动生成poco的T4模板。

    image

    3. 利用Petapoco的Database.tt生成poco时的问题一:"Failed to load provider Oracle.DataAccess.Client”

    一切准备好后,就在Database.tt中填写ConnectionStringName的名称,然后保存Database.tt,应该就自动生成Database.cs中的poco代码了。

    Database.tt中修改的部分

    image

    app.config中ConnectionStringName的配置如下:

    image 

    满以为可以很顺利的生成poco代码,结果事与愿违,保存Database.tt后出现了2个警告,Database.cs没有生成成功。

    image

    警告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行)

    image

    通过调试,发现上图中取出的rdr中并没有["TABLE_SCHEMA"]和["TABLE_TYPE"]的信息,所以生成poco时报错了。

    将上面两行注释掉就可以生成poco了。

    生成poco后,可以利用petapoco提供API,方便的操作数据库了。具体使用方法可以参考http://www.toptensoftware.com/petapoco/

    PS. PetaPoco确实轻量,没有任何dll,只有一个PetaPoco.cs的源码文件。如果对性能要求比较苛刻,但又想使用ORM,那么PetaPoco是个很好的选择。

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

  • 相关阅读:
    python基础--文件操作实现全文或单行替换
    python基础7--集合
    python读写json文件
    python基础6--目录结构
    python基础5--模块
    Ubuntu的一些常用快捷键
    ubuntu dpkg 命令详解
    linux(Ubuntu)安装QQ2013
    fcitx-sogoupinyin下载地址和安装
    Ubuntu下装QQ2014
  • 原文地址:https://www.cnblogs.com/wang_yb/p/2104788.html
Copyright © 2020-2023  润新知