【问题标题】:Calling SP from EF using same transaction of SaveChanges使用 SaveChanges 的相同事务从 EF 调用 SP
【发布时间】:2012-11-27 21:31:43
【问题描述】:

有人知道如何使用 objectContext SaveChanges 方法(EntityFramework 5)的相同事务调用 StoredProc?

目标是应用对象更改并调用存储的 Proc,该 Proc 在 DB 上执行一些“魔术”,但是,如果出现问题(使用 SaveChanges 或使用 SP 执行),则根本不会提交任何更改.

【问题讨论】:

    标签: entity-framework stored-procedures objectcontext


    【解决方案1】:

    步骤:

    1. 创建上下文
    2. 从上下文中获取连接
    3. 创建事务 (TransactionScope)
    4. 打开连接(将连接登记到在 3 中创建的环境事务中,并防止通过上下文关闭连接)
    5. 执行 SaveChanges()
    6. 执行您的存储过程
    7. 提交事务
    8. 关闭连接

    一些代码(MyContext 是从 DbContext 派生的):

    using (var ctx = new MyContext())
    {
        using (var trx = new TransactionScope())
        {
            var connection = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
            try
            {
                ctx.Entities.Add(new MyEntity() { Number = 123 });
                ctx.SaveChanges();
    
                ctx.Database.ExecuteSqlCommand("INSERT INTO MyEntities VALUES(300)");
                trx.Complete();
            }
            finally
            {
                connection.Close();
            }
        }
    }
    

    【讨论】:

    • 就像那是一个借口:-)
    • 完美!非常感谢@Pawel!
    • 我在 EF5 中找不到 ctx.Entities 属性
    • 这是我的上下文中的 DbSet 属性(即,我通过从 DbContext 派生它来创建上下文并在派生的上下文中创建 DbSet<MyEntity> Property...)
    • 一切看起来都很完美,但是......这与 Oracle 的工作方式相同吗?我认为它升级为 DTC,对吗?
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多