为Oracle数据库生成数据模型会无声地或“无法找到或加载已注册的.Net Framework数据提供程序”

时间:2018-03-13 14:19:00

标签: c# .net oracle entity-framework

执行摘要

我试图基于Oracle数据库生成实体框架模型。 Visual Studio"实体数据模型向导"突然消失,在设置中途没有错误消息。在命令行中使用edmgen将失败并显示Failed to find or load the registered .Net Framework Data Provider.

问题描述

方法1:使用向导生成模型

我有一个名为EFConsoleApp的全新控制台应用程序。从NuGet,我有最新版本的EntityFramework,Oracle.ManagedDataAccess和Oracle.ManagedDataAccess.EntityFramework。

我使用"添加 - >新物品......"菜单,将ADO.NET实体数据模型添加到我的项目中。

enter image description here

enter image description here

我从数据库中选择" EF Designer"在第一个向导窗口中。 (但是如果我尝试任何其他选项也会出现问题)。

enter image description here

我从下拉列表中选择我的数据连接。

enter image description here

我点击" next"。出现此空白窗口。它对所有用户输入都没有响应,并在大约五秒后消失。

enter image description here

Visual Studio恢复正常,但未添加任何模型,并且我的“输出”面板没有新输出(错误或其他)。

方法2:使用edmgen

生成模型

从管理员命令窗口,我执行edmgen

C:\Windows\system32>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\edmgen /connectionstring:"DATA SOURCE=ORCL2;USER ID=REDACTED;PASSWORD=REDACTED" /mode:FullGeneration /project:EFConsoleApp /provider:Oracle.ManagedDataAccess.Client
EdmGen for Microsoft (R) .NET Framework version 4.6.1038.0
Copyright (C) Microsoft Corporation. All rights reserved.

error 7001: Failed to find or load the registered .Net Framework Data Provider.

Generation Complete -- 1 errors, 0 warnings

失败了。

其他详细信息

根据Oracle.ManagedDataAccess.EntityFramework和Oracle.ManagedDataAccess的自述文件说明,我的app.config包含数据源和连接字符串的部分。它还包含我在machine.config中的oracle.manageddataaccess.client的<section>项。

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework"
      type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      requirePermission="false"/>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  </configSections>

  ...

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="ORCL2" descriptor="(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl2)))"/>
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="MyContext"      providerName="Oracle.ManagedDataAccess.Client" connectionString="DATA SOURCE=ORCL2;USER ID=REDACTED;PASSWORD=REDACTED"/>
  </connectionStrings>

Oracle.ManagedDataAccess已在GAC中注册。

C:\Windows\system32>gacutil -l Oracle.ManagedDataAccess
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
Copyright (c) Microsoft Corporation.  All rights reserved.

The Global Assembly Cache contains the following assemblies:
  Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL

Number of items = 1

我的machine.config包含对Oracle.ManagedDataAccess.Client的最新引用。

<configuration>
  <configSections>
    ...
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
    ...
  </configSections>
  ...
  <system.data>
    <DbProviderFactories>
      <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.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
      ...
    </DbProviderFactories>
  </system.data>
  ...
  <oracle.manageddataaccess.client>
    <version number="4.122.1.0">
      <settings>
        <setting name="TNS_ADMIN" value="C:\app\oracle_user\client\network\admin"/>
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>

如果我手动创建OracleConnection对象,我可以使用Oracle.ManagedDataAccess.Client成功连接Oracle数据库。

using System;
using Oracle.ManagedDataAccess.Client;

namespace EFConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            OracleConnection con = new OracleConnection();

            //using connection string attributes to connect to Oracle Database
            con.ConnectionString = "User Id=REDACTED;Password=REDACTED;Data Source=ORCL2";
            con.Open();
            Console.WriteLine("Connected to Oracle" + con.ServerVersion);

            OracleCommand cmd = con.CreateCommand();
            cmd.CommandText = "select * from REDACTED";
            OracleDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine(reader.GetInt32(0));
            }

            // Close and Dispose OracleConnection object
            con.Close();
            con.Dispose();
            Console.WriteLine("Disconnected");
            Console.ReadLine();
        }
    }
}

enter image description here

我安装了用于Visual Studio的Oracle Developer Tools。我已按照自述文件中的说明进行了故障排除&#34;无法找到或加载&#34;错误:

  

数据源配置向导可能会失败并显示错误&#34;无法找到或加载已注册的.NET框架数据提供程序&#34;如果尚未完全卸载某些其他数据提供程序,并且仍在machine.config文件中有一个条目。具体来说,如果DbProviderFactories部分的machine.config.xml文件中的Oracle Data Provider for .NET条目位于已经卸载的数据提供程序之后,则会发生此错误。修复是编辑machine.config并将Oracle Data Provider for .NET移动到DbProviderFactories部分中的第一项。

我已确认ODP.NET,托管驱动程序是DbProviderFactories部分中的第一项。

底线

我需要做些什么才能让我的模型正确生成?

0 个答案:

没有答案