3

我正在尝试将两段不同的代码集成到使用同一事务中。一种是 Oracle 上的实体框架(使用 odp.net 作为驱动程序),另一种是使用 odp.net 的标准 ado.net。两者都使用相同的连接字符串。

实现这一目标的正确方法是什么?

我可以使用 context.Connection.BeginTransaction() 启动 EF 事务,但这会给我返回 System.Data.Common.DbTransaction。

我可以以某种方式直接与 odp.net 一起使用吗?由于涉及 DTC 的所有困难,我宁愿不使用 TransactionScope。

有多种原因我不能简单地使用 EF 来访问这个存储过程(我们正在为 EF 使用一些定制的 T4 模板,这些模板目前不支持存储过程)。

4

1 回答 1

3

嗯,我想通了。

这是我所做的:

在使用实体框架之前,我会:

Context.Connection.Open();
var ts = Context.Connection.BeginTransaction();

然后我用 EF 对象做一些事情并调用 SaveChanges()。

对于 ADO.NET,我执行以下操作(只是一个示例,不是生产代码!):

   var conn = ((EntityConnection)dal.Context.Connection).StoreConnection;

   var cmd2 = conn.CreateCommand();
   cmd2.CommandText = "insert into tst_rob values ('3')";
   cmd2.ExecuteNonQuery();

问题在于将 Context.Connection 转换为 EntityConnection 以便能够访问底层连接。

最后我执行 ts.Commit() 或 ts.Rollback()。瞧,不涉及 DTC,而且都在同一笔交易中。

于 2013-01-10T13:29:43.700 回答