using IM.DomainCommons; using MediatR; using Microsoft.EntityFrameworkCore; namespace IM.Infrastructure.Efcore { public class BaseDbContext : DbContext { private IMediator? mediator; public BaseDbContext(DbContextOptions options, IMediator mediator) : base(options) { this.mediator = mediator; } public override async Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { if (mediator != null) { await mediator.DispatchDomainEventsAsync(this); } var softDeletedEntities = ChangeTracker .Entries() .Where(x => x.State == EntityState.Modified && x.Entity.IsDeleted) .ToList(); var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); softDeletedEntities.ForEach(e => e.State = EntityState.Detached); return result; } } }