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 驱动程序连接。
```csharppublic 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 数据库的,在数据开发中会让你的工作更轻松!