用EF连接Oracle数据库,运行报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用EF连接Oracle数据库,运行报错相关的知识,希望对你有一定的参考价值。

已经引用了引用了Oracle.ManagedDataAccess.dll和Oracle.ManagedDataAccess.EntityFramework.dll。
报错信息:
The Entity Framework provider type 'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342' registered in the application config file for the ADO.NET provider with invariant name 'Oracle.ManagedDataAccess.Client' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application.

参考技术A 数据库为Oracle,就不要使用EF了。

问题已经很明显。“Make sure the provider is registered in the 'entityFramework' section of the application config file”,就是让你看看在App.config文件中的<provider>。
【源文件中的内容如下】:

<entityFramework>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</entityFramework>

按理说,只要将<provider />写成:

<provider invariantName="Oracle.ManagedDataAccess.Client" type="System.Data.OracleProviderServices, EntityFramework.OracleServer" />

之类即可,但是可悲啊!

目前支持EF6的provider有:

(1)Microsoft SQL Server provider
(2)Microsoft SQL Server Compact Edition provider
(3)Devart dotConnect Data Providers 【注意】
(4)Firebird provider
(5)Visual Fox Pro porvider
(6)mysql
(7)PostgreSQL

1、2、4、5、7均可以从NuGget中获取。3、7需要到相应的网站获取。

注意第三个:这个插件就是用于Oracle数据库的,其为第三方插件,由Devart公司开发。但有两大致命缺点:1、收费(是30天免费试用,过了30天要么卸载,要么付款)。2、目前支持的Oracle的最高版本为:Oracle8.2i。
参考技术B 你这个问题我认为存在2种可能的原因:1.和客户端有关。本机安装oracle客户端。2.和连接字符串有关。字符串里的信息不对。

实体框架代码的动态连接字符串首先在运行时 EF6(mssql、mysql、oracle)中用于多个数据库提供程序

【中文标题】实体框架代码的动态连接字符串首先在运行时 EF6(mssql、mysql、oracle)中用于多个数据库提供程序【英文标题】:Dynamic connection string for entity framework code first for multiple database providers at runtime EF6 ( mssql, mysql, oracle ) 【发布时间】:2017-10-15 02:09:50 【问题描述】:

我正在尝试使用实体框架代码优先模型通过动态生成连接字符串来连接多个数据库提供程序。但它没有按预期工作。

这是要查看的代码:

 switch (providerName)
        
            case "System.Data.SqlClient":
                entityBuilder = new EntityConnectionStringBuilder();
                entityBuilder.Provider = providerName;
                //ConfigurationManager.ConnectionStrings["mssql"].ConnectionString
                break;
            case "MySql.Data.MySqlClient":
                entityBuilder = new EntityConnectionStringBuilder();
                entityBuilder.Provider = providerName;
                //ConfigurationManager.ConnectionStrings["mysql"].ConnectionString
                break;
            default:
                break;
        

        switch (providerName)
        
            case "System.Data.SqlClient":
                conn = new SqlConnectionStringBuilder(entityBuilder.ProviderConnectionString)
                

                    UserID = databaseUserId,
                    Password = databasePassword,
                    DataSource = serverName,
                    IntegratedSecurity = false,
                    InitialCatalog = databaseName

                .ConnectionString;

                break;
            case "MySql.Data.MySqlClient":
                conn = new MySql.Data.MySqlClient.MySqlConnectionStringBuilder(entityBuilder.ProviderConnectionString)
                
                    Server = serverName,
                    UserID = databaseUserId,
                    Password = databasePassword,
                    Database = databaseName,
                    PersistSecurityInfo = true

                .ConnectionString;
                break;
            default:
                break;
        

网页配置

<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider></providers> </entityFramework>

 <DbProviderFactories>
  <remove invariant="MySql.Data.MySqlClient" />
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>

DbContext 构造函数

  ` public partial class ModelCodeFist : DbContext

    public ModelCodeFist(string connection)
        : base(connection)
    
    

`

我如何在运行时更改默认提供程序,因为 EF 将 sql 连接器作为 defaultConnectionFactory

动态连接到 mssql 正在工作,但是对于 mysql 它正在生成错误,因为 默认连接器仍然是 sqlclient,请查看下图:

如果我错过了什么,请告诉我 谢谢!

【问题讨论】:

【参考方案1】:

您想创建自己的 ProviderFactory 实现 IDbConnectionFactory

public class MyProviderFactory : IDbConnectionFactory
    
    public DbConnection CreateConnection(string nameOrConnectionString)
    
        if ("mySqlName".equals(nameOrConnectionString))
        
            return new MySqlConnection("<Connection String>");
        
        else 
        
            return new SqlConnection("<Connection String>");
        
    

然后在您的 app.config 中将其设置为 DefaultConnectionFactory

<defaultConnectionFactory type="MyAssmebly.MyProviderFactory, MyAssmebly">
  <parameters>

未经测试的代码,当然未经性能测试!

【讨论】:

以上是关于用EF连接Oracle数据库,运行报错的主要内容,如果未能解决你的问题,请参考以下文章

在 navicat 连接的oracle中,调用存储过程 报错?

实体框架代码的动态连接字符串首先在运行时 EF6(mssql、mysql、oracle)中用于多个数据库提供程序

用root连接oracle报错ERROR: ORA-12546: TNS:permission denied

C#的EF框架怎么连接Oracle数据库

采用ef6连接Oracle 该怎么解决

在.net 中使用EF 连接oracle 数据库,如何使用存储过程。求高手指点,help!