在EF4中帮助TransactionScope

时间:2011-09-14 02:07:33

标签: c# entity-framework-4 transactionscope

我是TransactionScope的新手。我只是想确保我在做什么在下面的代码中是正确的。

private void DoSomeWork()
{
    using (var context = new MyEntities())
    using (TransactionScope scope = new TransactionScope())
    {
        context.Connection.Open();

        int ID = context.CallUpdateStoredProc();

        RecursiveDelete((EntityConnection)context.Connection, ID);

        context.Connection.Close();

        scope.Complete(); 
    }
}

private void RecursiveDelete(EntityConnection connection,int someID)
{
    using (var context = new MyEntities(connection))
    {
        var UpdatedLinks = context.CallSaveStoredProc(someID).ToList();

        foreach (int UpdatedLink in UpdatedLinks)
        {
            RecursiveDelete(connection,UpdatedLink);     
        }
    }
}

2 个答案:

答案 0 :(得分:0)

实体框架4可识别TransactionScope,因此您的示例将正常工作。请参阅this example on MSDN

答案 1 :(得分:0)

就你如何使用TransactionScope class而言,是的,这是正确的,你通常使用以下模式:

// Use overloads of constructor if you need to fine-tune the transaction
using (var tx = new TransactionScope())
{ 
    // Do your work.

    // Call Complete if the work is truly complete.
    // Note, if you determine through logic, you don't
    // have to call Complete.
    tx.Complete();
}

调用Complete method后,它会指示即将提交的临时数Transaction。请注意,在调用Complete时未提交事务,但在TransactionScope被处置时提交。

来自TransactionScope.Complete的文档:

  

资源管理器之间的实际提交工作发生在   如果TransactionScope对象创建了,则结束使用语句   事务。

此外,如示例代码中的注释所示,我们有意识地决定是否应该调用Complete

再次,从TransactionScope.Complete的文档(强调我的):

  

当您满意时,范围内的所有操作都是   成功完成后,您应该只调用此方法一次   告知事务管理器所有资源的状态是   一致,并且可以提交交易。

现在,关于TransactionScope是否可以与实体框架一起使用,答案是肯定的,因为MSDN上的文档标题为"How to: Manage Transactions in the Entity Framework"表示。