对EntityFramework和ado.net存储过程使用相同的事务

时间:2013-01-09 16:13:38

标签: oracle entity-framework ado.net

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

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

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

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

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

1 个答案:

答案 0 :(得分: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();

catch是将Context.Connection转换为EntityConnection以便能够访问底层连接。

最后我做了ts.Commit()或ts.Rollback()。 Voila,没有涉及DTC,并且都在同一笔交易中。