使用odp.net托管驱动程序为实体框架导入函数

时间:2013-10-07 06:34:21

标签: entity-framework odp.net

我最近从ODP Unmanaged转换为ODP Managed(与Entity Framework结合使用)。 在web.config部分添加必要的信息后,Unmanaged驱动程序正常工作。我可以使用函数导入 - 获取列信息添加存储过程并生成复杂类型(我正在尝试使用OUT refcursor参数导入存储过程)。 在切换之后,配置部分已更新以反映新格式,并且一切都在运行时工作(因此格式正确)。

然而,当我尝试再次生成复杂类型(或添加新的函数导入)时,我只得到一个System.notSupportedException Message: The specified type is not supported by this selector)没有任何指示它是哪个类型/选择器(显然)......

谷歌没有发现任何事情,甲骨文论坛上的主题也没有得到回应。

版本: ODP.Net(ODAC):v12.1(生产版本; DLL v4.121.1.0) EF v5 .NET v4.5 配置文件(略微修剪):

<configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess"/>
</configSections>
<oracle.manageddataaccess.client>
    <version number="*">
        <edmMappings>
            <edmMapping dataType="number">
                <add name="bool" precision="1"/>
                <add name="byte" precision="2" />
                <add name="int16" precision="5" />
                <add name="int32" precision="10" />
                <add name="int64" precision="38" />
            </edmMapping>
        </edmMappings>
        <implicitRefCursor>
            <storedProcedure schema="ECOM" name="SHP_API_ORDERS.CREATE_ORDER">
                <refCursor name="O_RS">
                    <bindInfo mode="Output"/>
                    <metadata columnOrdinal="0" columnName="COL1" nativeDataType="Number" providerType="Decimal" allowDBNull="false" numericPrecision="10" numericScale="0" />
                    <metadata columnOrdinal="1" columnName="COL2" nativeDataType="Date" providerType="Date" allowDBNull="true" />
                    <metadata columnOrdinal="2" columnName="COL3" nativeDataType="Varchar2" providerType="Varchar2" allowDBNull="false" columnSize="10" />
                </refCursor>
            </storedProcedure>
        </implicitRefCursor>
    </version>
</oracle.manageddataaccess.client>
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
</entityFramework>
<system.data>
    <DbProviderFactories>
        <remove invariant="Oracle.ManagedDataAccess.Client" />
        <add name="ODP.NET, Managed Driver"
             invariant="Oracle.ManagedDataAccess.Client"
             description="Oracle Data Provider for .NET, Managed Driver"
             type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
</system.data>

3 个答案:

答案 0 :(得分:4)

Unmanaged ODP.NET和Managed ODP.NET之间的隐式引用游标配置文件格式不同。这可能是你问题的一部分。

为了避免拉扯你的头发,安装最新的Visual Studio(ODT)Oracle Developer Tools并使用自动生成此配置的新功能:

1)如果您还没有

,请安装ODT 12.1

2)在server explorer中找到存储过程,右键单击并运行它,然后输入输入参数。

3)对于表示实体功能返回值的输出引用光标,选择“添加到配置”复选框。

4)然后选择“显示配置”(然后剪切并粘贴)或“添加到配置”。

以下是我所说的截图:

http://i.imgur.com/t1BfmUP.gif

如果这不能解决问题,请使用该布尔映射。在撰写本文时,我并不是百分之百确定这一点,但我记得听说支持布尔值是托管和非托管ODP.NET之间的另一个区别。我确定它已经隐藏在发行说明或某个地方的文档中。

Christian Shay

的Oracle

答案 1 :(得分:0)

您可能想要尝试的两件事可能会解决问题:

  1. 确保模式名称,存储过程名称和 配置中的列名与Oracle中的列名相同。
  2. 尝试将本机类型映射到更符合要求的提供程序类型,例如 第一列COL1 - 将int32 providerType 映射到 您的edmmapping强制执行number(10,0) nativeDataType ,而不是 你现在拥有的十进制数。对另一方来说等等 列(如删除列长度),直到您没有看到错误或获得不同的错误。

答案 2 :(得分:0)

我遇到了同样的错误,我认为我的问题是提供者类型为DOUBLE或DECIMAL。但是,我有一个有你的3列类型的工作。您的问题是数字(10,0)应该是&#34; Int64&#34;的提供者类型。

存储过程:

create or replace PROCEDURE "PROC_ESCC_FIELDS" (p_recordset OUT SYS_REFCURSOR)
AS
BEGIN
OPEN p_recordset FOR
  SELECT COL1, COL2, COL3
     FROM MyTable;
END PROC_ESCC_FIELDS;

这可以工作并返回光标:

<oracle.manageddataaccess.client>
  <version number="*">
    <implicitRefCursor>
      <storedProcedure schema="SERFIS" name="PROC_V_SERFIS_ESCC_FIELDS">
        <refCursor name="P_RECORDSET">
          <bindInfo mode="Output" />
            <metadata columnOrdinal="0" columnName="COL1" providerType="Int64" allowDBNull="false" nativeDataType="Number" />
            <metadata columnOrdinal="1" columnName="COL2" providerType="Date" allowDBNull="true" nativeDataType="Date" />
            <metadata columnOrdinal="2" columnName="COL3" providerType="Varchar2" allowDBNull="false" nativeDataType="Varchar2" />
        </refCursor>
      </storedProcedure>
    </implicitRefCursor>
  </version>
</oracle.manageddataaccess.client>

Click here for a list of the providerType and nativeDataType, etc. ENUMS: