我正在尝试将两个不同的代码集成到同一个事务中。一个是Oracle上的实体框架(使用odp.net作为驱动程序),另一个是使用odp.net的标准ado.net。两者都使用相同的连接字符串。
实现这一目标的正确方法是什么?
我可以使用context.Connection.BeginTransaction()启动EF事务,但这会让我回到System.Data.Common.DbTransaction。
我可以直接用odp.net以某种方式使用它吗?由于涉及DTC的所有困难,我宁愿不使用TransactionScope。
有很多原因我不能简单地使用EF来访问这个存储过程(我们正在使用一些定制的T4模板用于EF,此时不支持存储过程。)
答案 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,并且都在同一笔交易中。