如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?

Posted

技术标签:

【中文标题】如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?【英文标题】:How to connect to Oracle DB using TNS alias with Entity Framework 6? 【发布时间】:2017-02-13 15:23:18 【问题描述】:

在我的设置中,我有一个使用 Visual Studio 2015 构建的 .NET 应用程序,试图使用 Entity Framework 6 访问 Oracle 12c 数据库上的数据。

这是我为实现这一目标所做的:

我关注a tutorial at oracle.com 了解如何使用 nuget 安装官方 Oracle ODP.NET、托管实体框架驱动程序及其依赖项。 我确保可以找到 tnsnames.ora 和 sqlnet.ora。 (环境变量TNS_ADMIN配置正确) 我为 oracle 驱动程序启用了跟踪日志记录,以查看此处实际发生的情况。 我创建了一个映射一些实体的 EDMX 文件(这已经需要下面描述的解决方法)

这是我的 App.config 的样子(引入换行符以提高可读性):

  <oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="TraceLevel" value="7" />
        <setting name="TraceOption" value="0" />
        <setting name="TraceFileLocation" value="C:\Temp" />
        <setting name="TNS_ADMIN" value="c:\Temp\tns" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="MyModel"  
         connectionString="metadata=res://*/UDBModel.csdl|res://*/UDBModel.ssdl|res://*/UDBModel.msl;
                           provider=Oracle.ManagedDataAccess.Client;
                           provider connection string=&quot;User Id=*****;Password=*****;Data Source=MYDATASOURCE.WORLD;&quot;" 
         providerName="System.Data.EntityClient" />

尝试访问数据库时失败并出现异常:

“ORA-12533:Netzwerksession:Syntaxfehler bei Verbindungstransportadresse”

根据the oracle docs翻译成

“ORA-12533: TNS: 非法地址参数”

跟踪日志显示 tnsnames.ora 已正确解析。

当使用 IP 地址和端口而不是 TNS 名称时,连接工作正常。但由于 tnsnames.ora 由我们公司的数据库管理员管理,因此无法使用 IP 地址寻址服务器。

我还应注意,较旧的驱动程序(例如 Oracle.DataAccess.dll)使用此设置访问数据库没有问题。

编辑:这是我现在使用的 tnsnames.ora 文件:

MYDATASOURCE.WORLD = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
    (ADDRESS = (PROTOCOL = IPC)(KEY = MYDATASOURCE))
    (ADDRESS = (COMMUNITY = TCP.world)(PROTOCOL = TCP)(Host = myds.example.com)(Port = 1530)))
    (CONNECT_DATA = (SID = MYDATASOURCE))
  )

我在这里做错了什么?

注意:有类似的问题。但是,在那种情况下有帮助的解决方案在这里没有帮助,并且那里遇到的异常与这里遇到的不同:

Opening Oracle OleDb connection succeeds, while managed driver connection fails Unable to connect to Oracle using TNS and C# Can't connect to Oracle using tns Entity Framework Code First and Oracle ODAC 12c Release 3 Error Oracle.ManagedDataAccess not resolving alias in connection string Entity framework connection with oracle databse

【问题讨论】:

看看这个:oraclenerd.com/2010/02/… @WernfriedDomscheit 谢谢,但 tnsnames.ora 中的行首没有空格。 【参考方案1】:

ORA-12533:TNS:非法地址参数

原因:指定了一组非法的协议适配器参数。在一些 在这种情况下,当无法与协议传输建立连接时会返回此错误。操作:验证是否可以使用指定的协议到达目的地。检查 TNSNAMES.ORA 的 ADDRESS 部分中的参数。可以在您平台的 Oracle 操作系统特定文档中找到合法的 ADDRESS 参数格式。如果未正确配置或名称拼写错误,则在传输层解析名称(例如 DECnet 对象名称)的协议很容易受到此错误的影响。

COMMUNITY 是 Oracle 版本 10g 之后 tnsnames.ora 中不支持的网络参数。所以删除这个参数并只保留(PROTOCOL=tcp),这应该可以解决。同时删除第一个 ADDRESS 参数,该参数用于 Oracle Listener.ora 文件。

Unsupported Parameters

【讨论】:

事实证明——重新添加COMMUNITY-参数并没有什么坏处。真正的问题是用于 listener.ora 文件的地址行。【参考方案2】:

我假设 ODP.NET 托管驱动程序找不到您的 tnsnames.ora 文件。 ODP.NET Managed Driver 使用此顺序来解析别名:

    .NET 配置文件中&lt;oracle.manageddataaccess.client&gt; 部分下的dataSources 部分中的数据源别名。 tnsnames.ora 文件中的数据源别名,位于 .NET 配置文件中 TNS_ADMIN 指定的位置。位置可以由绝对或相对目录路径组成。 与.exe 位于同一目录中的tnsnames.ora 文件中的数据源别名。

见Data Provider for .NET Developer's Guide

如您所见,ODP.NET 托管驱动程序不会读取环境变量来确定 TNS_ADMIN 的值。检查您的 .NET 配置文件(即machine.configweb.configuser.config

顺便说一句,您可以运行set NLS_LANG=AMERICAN_GERMANY 来获取英文错误消息。你也可以在你的注册表中设置这个HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG

【讨论】:

感谢您的回答。但正如我所写:“跟踪日志显示 tnsnames.ora 已正确解析。” 我仍然将TNS_ADMIN 设置添加到 App.config 文件中。正如我从日志中看到的那样,该文件是从指定位置加载的...

以上是关于如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 TNSNames 别名语法的 JDBC 瘦驱动程序连接到 Oracle 数据库

如何将 JDBC 连接到 tns oracle

如何在实体框架中调用带有联接的存储过程?

从 mulestudio 连接到 oracle-tns

实体框架 - Linq 中的数据库视图或连接到实体

实体框架到 MySql 连接到数据库失败 [重复]