38 lines
1.0 KiB
C#
38 lines
1.0 KiB
C#
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<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
|
|
{
|
|
if (mediator != null)
|
|
{
|
|
await mediator.DispatchDomainEventsAsync(this);
|
|
}
|
|
|
|
var softDeletedEntities = ChangeTracker
|
|
.Entries<ISoftDelete>()
|
|
.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;
|
|
}
|
|
}
|
|
}
|