EF6x究竟能不能成功连接Oracle(ef能连接oracle么)

EF6.x 究竟能不能成功连接 Oracle?

Entity Framework(EF)是微软推出的一种面向对象的关系映射框架,有助于开发人员以更自然的方式管理数据库。EF大力推崇约定优于配置的理念,需要满足一定的数据模型规则,自动将数据模型映射到数据库中。

一般而言,EF可很好的支持 MS SQL Server, MySQL、SQLite、PostgreSQL 等,但在使用 Oracle 数据库时,却遇到种种问题。许多开发者尝试使用 EF6.x 连接 Oracle 数据库,但往往会遇到一些难以逾越的坑。本文主要探讨使用 EF6.x 连接 Oracle 数据库的相关问题和解决方案。

## 连接 Oracle 数据库

EF 官方文档上明确指出,EF支持 Oracle 数据库的驱动程序,但是,许多开发者可能会遇到一些问题,甚至会失败。失败的情况通报如下:

– 对于某些框架而言,Oracle 数据库不是他们的首选;

– 更新 Oracle 驱动程序很繁琐,不同的 EF 版本需要不同的 Oracle 数据库驱动程序;

– Oracle 驱动程序只有付费的商业授权,运输成本较高,但是在 CentOS、Ubuntu 和 Docker 容器中等环境下,运输成本会相应降低。

## 解决方案

### 驱动程序

当我们想要 EF6.x 成功连接 Oracle 数据库时,首先要确保可以成功下载 Oracle 数据库的驱动程序,这个步骤非常重要。下载驱动程序的方法很多,例如从官网或NuGet包管理器中下载最新的Oracle.Dataaccess或Oracle.ManagedDataAccess程序包。为了确保驱动程序是最新的版本,请订阅Oracle的更新号。下载后,先在项目中安装驱动程序,再在app.config或web.config文件中更新实体模型。

EF6.x 与 Oracle 数据库的连接过程:

“`csharp

string connStr = “Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.11.20)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));User Id=test;Password=test;Persist Security Info=True”

using (var db = new EntityContext(connStr))

{

// 查询操作

var students = db.Students.Where(p => p.Age > 20).ToList();

foreach (var stu in students)

{

Console.WriteLine(stu.Name);

}

}


### 透明证书加密

如果使用Oracle的透明证书加密功能,EF6.x的使用就会变得更复杂。透明证书加密通常用于数据库中的列级加密。在 Entity Framework 6 下,要使用透明证书加密,我们需要重写对象上下文的CreateConnection方法。我们可以创建一个自定义的 EntityConnection、DbConnection 和 DbCommand,以便 EF6.x 可以与 OCI8 驱动程序连接。

```csharp
public class OracleEntityConnection : EntityConnection
{
public OracleEntityConnection(DbConnection connection, MetadataProperty metadataProperty) : base(metadataProperty, connection){}
protected override DbCommand CreateDbCommand()
{
var oracleCommand = new OracleCommand();
oracleCommand.BindByName = true;
OracleCommandToDbCommand(oracleCommand, CommandTimeout);
return oracleCommand;
}

private static void OracleCommandToDbCommand(DbCommand oracleCommand, int? commandTimeout = null)
{
var dbCommand = (DbCommand)oracleCommand;
dbCommand.InitialLONGFetchSize = -1;
if (commandTimeout.HasValue)
{
dbCommand.CommandTimeout = commandTimeout.Value;
}
if (oracleCommand.Connection != null && oracleCommand.Connection.State == ConnectionState.Open)
{
oracleCommand.SetOraclePackage("SYS.DBMS_CRYPTO"); // 添加透明证书加密共管程序
}
}
}

### 数据库提供程序

我们可以在 EF6.x 中使用 Oracle 提供程序以及自带的驱动程序。(仅限 12c 及以上版本)。

“`csharp

using System.Configuration;

using System.Data.Entity;

using Oracle.ManagedDataAccess.EntityFramework;

using EFDemo.Models;

namespace EFDemo.DataAccess

{

public class OracleDbContext : DbContext

{

public OracleDbContext()

: base(ConfigurationManager.ConnectionStrings[“OraDbContext”].ConnectionString)

{

Database.SetInitializer(null);

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.HasDefaultSchema(“TEST”); // 默认模式名称

base.OnModelCreating(modelBuilder);

}

public DbSet Users { get; set; }

}

}


## 总结

在使用 EF6.x 连接 Oracle 数据库时,需要务必注意以下问题:

- 确保下载了正确的 Oracle 数据库的驱动程序;
- 如需使用透明证书加密,请重写对象上下文的CreateConnection方法。
如果能搞定这些难题,EF6.x 也是可以轻松连接 Oracle 数据库的,在数据开发中会让你的工作更轻松!

数据运维技术 » EF6x究竟能不能成功连接Oracle(ef能连接oracle么)