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 恢复正常,但没有添加模型,我的输出面板也没有新的输出(错误或其他)。
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 部分中的第一项。
我需要做什么才能让我的模型正确生成?
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |