38 lines
1.4 KiB
C#
38 lines
1.4 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Storage;
|
|
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events;
|
|
using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF.Services;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data.Common;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF.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 ResilientTransaction(context);
|
|
|
|
public async Task ExecuteAsync(Func<Task> 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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|