我试图基于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"在第一个向导窗口中。 (但是如果我尝试任何其他选项也会出现问题)。
我从下拉列表中选择我的数据连接。
我点击" next"。出现此空白窗口。它对所有用户输入都没有响应,并在大约五秒后消失。
Visual Studio恢复正常,但未添加任何模型,并且我的“输出”面板没有新输出(错误或其他)。
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();
}
}
}
我安装了用于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部分中的第一项。
我需要做些什么才能让我的模型正确生成?