为 Oracle 数据库生成数据模型以静默方式失败或出现“无法找到或加载已注册的 .Net Framework 数据提供程序”

Kev*_*vin 5 .net c# oracle entity-framework

执行摘要

我正在尝试基于 Oracle 数据库生成实体框架模型。Visual Studio 的“实体数据模型向导”在安装过程中突然消失,没有错误消息。edmgen从命令行使用失败并显示Failed to find or load the registered .Net Framework Data Provider..

问题描述

方法一:用向导生成模型

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

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

在此处输入图片说明

在此处输入图片说明

我在第一个向导窗口中选择了“EF Designer from database”。(但如果我尝试任何其他选项,也会出现问题)。

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

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
Run Code Online (Sandbox Code Playgroud)

它失败。

额外细节

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

  <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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我的 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>
Run Code Online (Sandbox Code Playgroud)

如果我手动创建 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我安装了适用于 Visual Studio 的 Oracle 开发人员工具。我已按照自述文件中解决“无法找到或加载”错误的部分中的说明进行操作:

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

我已经确认 ODP.NET, Managed Driver 是 DbProviderFactories 部分中的第一项。

底线

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