为SaveChangesAsync添加一些额外的工作

时间:2014-11-11 13:40:37

标签: c# entity-framework-6

我必须在数据库上下文SaveChanges方法中添加一些额外的工作。我需要在base.SaveChanges()方法之后完成这项工作,因为在将它们添加到数据库后我需要记录ID。我的SaveChanges方法的大纲如下所示(需要两个try..catch块来隔离保存数据库更改与其他操作):

public override int SaveChanges()
{
    using (var scope = new TransactionScope())
    {
        var result = 0;
        try
        {
            result = base.SaveChanges();
        }
        catch (Exception ex)
        {
            //Log context exception             
            throw;
        }

        try
        {
            //do some extra work
            var extraWorkRes = DoExtraWork();
        }
        catch (Exception ex)
        {
            //Log exception
            throw;
        }

        scope.Complete();
        return result;
    }
}

我的问题是SaveChangesAsync方法,因为我没有很多.NET任务经验,也不知道我是否正确地覆盖它。

public override  async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
 {
     using (var scope = new TransactionScope())
     {
         var result = 0;

         try
         {
             result = await base.SaveChangesAsync(cancellationToken);
         }
         catch (Exception ex)
         {
             //log context exception
             throw;
         }

         try
         {
            //do some extra work
            var extraWorkRes = await DoExtraWorkAsync(cancellationToken);
         }
         catch (Exception ex)
         {
             //Log exception
             throw;
         }

         scope.Complete();
         return result;
     }
 }

 private Task<int> DoExtraWorkAsync(CancellationToken cancellationToken)
 {
    return Task.Run<int>(() => this.DoExtraWork(cancellationToken));
 }

我需要帮助,一些建议如何正确覆盖SaveChangesAsync

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

在Task.Run中包装同步方法并调用它TheOriginalMethodAsync是一种常见的代码气味

DoExtraWork()是一个CPU绑定操作,您希望在其发生时释放当前线程吗?如果是这样,请将其重构为内联:

var extraWorkRes = await Task.Run<int>(() => this.DoExtraWork());

如果没有,只需直接调用它:

var extraWorkRes = this.DoExtraWork();

您是否需要在SaveChanges之外使用DoExtraWork的结果?如果没有,您不需要分配它。

如果这是您的真实代码,请注意您错过了Task.Run的结束括号。其他一切看起来都不错。当你运行它时是否遇到任何问题,或者你只是为了理智而检查它?