Я использую перегрузку для SaveChangesAsyn c на моей базе DbContext, которая принимает любое произвольное необработанное значение sql, ключ заключается в том, чтобы обернуть всю обработку внутри созданной вручную транзакции:
public async Task<int> SaveChangesAsync(string customCommand,
CancellationToken cancellationToken = default(CancellationToken),
params object[] parameters)
{
using (var transaction = Database.BeginTransaction())
{
try
{
var result = await base.SaveChangesAsync(true, cancellationToken);
await Database.ExecuteSqlCommandAsync(customCommand, parameters);
transaction.Commit();
return result;
}
catch (Exception ex)
{
transaction.Rollback();
throw ex.Handle();
}
}
}
Примечание: Handle () - это метод расширения, в котором я преобразую исключения t- sql в мои бизнес-исключения, поэтому этот метод здесь не имеет значения.