public async Task <object> AroundInvoke(IInvocationContext invocationContext) { // May consider TransactionScope because EF one really sucks at nesting // But TransactionScope is not good for async before .NET 4.5.1. // May consider for future version var dbContext = _dbContext.Value; if (dbContext.Database.CurrentTransaction != null) { var result = await invocationContext.Proceed(); await _completingEvents.FireAsync(new TransactionCompleting()); dbContext.SaveChanges(); return(result); } using (var transaction = dbContext.Database.BeginTransaction()) { try { var result = await invocationContext.Proceed(); await _completingEvents.FireAsync(new TransactionCompleting()); dbContext.SaveChanges(); transaction.Commit(); await _successfulEvents.FireAsync(new TransactionComitted()); return(result); } catch (Exception) { transaction.Rollback(); throw; } } }