我必须在数据库上下文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
。
提前感谢您的帮助。
答案 0 :(得分:2)
在Task.Run中包装同步方法并调用它TheOriginalMethodAsync是一种常见的代码气味。
DoExtraWork()是一个CPU绑定操作,您希望在其发生时释放当前线程吗?如果是这样,请将其重构为内联:
var extraWorkRes = await Task.Run<int>(() => this.DoExtraWork());
如果没有,只需直接调用它:
var extraWorkRes = this.DoExtraWork();
您是否需要在SaveChanges之外使用DoExtraWork的结果?如果没有,您不需要分配它。
如果这是您的真实代码,请注意您错过了Task.Run的结束括号。其他一切看起来都不错。当你运行它时是否遇到任何问题,或者你只是为了理智而检查它?