namespace ASC.EventBus.Extensions.Logger.Utilities; public class ResilientTransaction { private DbContext _context; private ResilientTransaction(DbContext context) => _context = context ?? throw new ArgumentNullException(nameof(context)); public static ResilientTransaction New(DbContext context) => new(context); public async Task ExecuteAsync(Func action) { //Use of an EF Core resiliency strategy when using multiple DbContexts within an explicit BeginTransaction(): //See: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency var strategy = _context.Database.CreateExecutionStrategy(); await strategy.ExecuteAsync(async () => { using (var transaction = _context.Database.BeginTransaction()) { await action(); transaction.Commit(); } }); } }