【问题标题】:using same transaction for EntityFramework and ado.net stored procedure对 EntityFramework 和 ado.net 存储过程使用相同的事务
【发布时间】:2013-01-10 21:29:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: oracle entity-framework ado.net


    【解决方案1】:

    好吧,我想通了。

    这是我的工作:

    在使用实体框架之前:

    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,而且都在同一笔交易中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2012-03-15
      • 1970-01-01
      • 2012-12-25
      • 2021-12-29
      相关资源
      最近更新 更多