diff --git a/src/E13.Common.Data.Db/Interceptors/CreatableInterceptor.cs b/src/E13.Common.Data.Db/Interceptors/CreatableInterceptor.cs index e8bf917..fe65308 100644 --- a/src/E13.Common.Data.Db/Interceptors/CreatableInterceptor.cs +++ b/src/E13.Common.Data.Db/Interceptors/CreatableInterceptor.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace E13.Common.Data.Db.Interceptors @@ -12,19 +13,42 @@ namespace E13.Common.Data.Db.Interceptors public sealed class CreatableInterceptor : SaveChangesInterceptor { public override InterceptionResult SavingChanges( - DbContextEventData data, + DbContextEventData eventData, InterceptionResult result) { - var auditContext = data.Context as IAuditContext ?? throw new Exception("Audit context is not set."); + var auditContext = eventData.Context as IAuditContext ?? throw new Exception("Audit context is not set."); - foreach (var entry in data.Context!.ChangeTracker.Entries() + HandleEventData(eventData, auditContext); + + return base.SavingChanges(eventData, result); + } + + public override ValueTask> SavingChangesAsync( + DbContextEventData eventData, + InterceptionResult result, + CancellationToken cancellationToken = default) + { + var auditContext = eventData.Context as IAuditContext ?? throw new Exception("Audit context is not set."); + + HandleEventData(eventData, auditContext); + + return base.SavingChangesAsync(eventData, result, cancellationToken); + } + + /// + /// Handles the event data for the creatable entities. + /// + /// + /// + private static void HandleEventData(DbContextEventData eventData, IAuditContext auditContext) + { + foreach (var entry in eventData.Context!.ChangeTracker.Entries() .Where(e => e.State == EntityState.Added)) { entry.Entity.Created = DateTime.UtcNow; entry.Entity.CreatedBy = auditContext.AuditUser; entry.Entity.CreatedSource = auditContext.Source; } - return base.SavingChanges(data, result); } } } diff --git a/src/E13.Common.Data.Db/Interceptors/ModifiableInterceptor.cs b/src/E13.Common.Data.Db/Interceptors/ModifiableInterceptor.cs index d067fa4..176926e 100644 --- a/src/E13.Common.Data.Db/Interceptors/ModifiableInterceptor.cs +++ b/src/E13.Common.Data.Db/Interceptors/ModifiableInterceptor.cs @@ -6,25 +6,50 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Threading; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace E13.Common.Data.Db.Interceptors { public sealed class ModifiableInterceptor : SaveChangesInterceptor { public override InterceptionResult SavingChanges( - DbContextEventData data, + DbContextEventData eventData, InterceptionResult result) { - var auditContext = data.Context as IAuditContext ?? throw new Exception("Audit context is not set."); + var auditContext = eventData.Context as IAuditContext ?? throw new Exception("Audit context is not set."); - foreach (var entry in data.Context!.ChangeTracker.Entries() + HandleEventData(eventData, auditContext); + + return base.SavingChanges(eventData, result); + } + + public override ValueTask> SavingChangesAsync( + DbContextEventData eventData, + InterceptionResult result, + CancellationToken cancellationToken = default) + { + var auditContext = eventData.Context as IAuditContext ?? throw new Exception("Audit context is not set."); + + HandleEventData(eventData, auditContext); + + return base.SavingChangesAsync(eventData, result, cancellationToken); + } + + /// + /// Handles the event data for the creatable entities. + /// + /// + /// + private static void HandleEventData(DbContextEventData eventData, IAuditContext auditContext) + { + foreach (var entry in eventData.Context!.ChangeTracker.Entries() .Where(e => e.State is EntityState.Added or EntityState.Modified)) { entry.Entity.Modified = DateTime.UtcNow; entry.Entity.ModifiedBy = auditContext.AuditUser; entry.Entity.ModifiedSource = auditContext.Source; } - return base.SavingChanges(data, result); } } } diff --git a/src/E13.Common.Data.Db/Interceptors/SoftDeleteInterceptor.cs b/src/E13.Common.Data.Db/Interceptors/SoftDeleteInterceptor.cs index dc334ac..64262dd 100644 --- a/src/E13.Common.Data.Db/Interceptors/SoftDeleteInterceptor.cs +++ b/src/E13.Common.Data.Db/Interceptors/SoftDeleteInterceptor.cs @@ -6,18 +6,44 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Threading; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace E13.Common.Data.Db.Interceptors { public sealed class SoftDeleteInterceptor : SaveChangesInterceptor { public override InterceptionResult SavingChanges( - DbContextEventData data, + DbContextEventData eventData, InterceptionResult result) { - var auditContext = data.Context as IAuditContext ?? throw new Exception("Audit context is not set."); + var auditContext = eventData.Context as IAuditContext ?? throw new Exception("Audit context is not set."); - foreach (var entry in data.Context!.ChangeTracker.Entries()) + HandleEventData(eventData, auditContext); + + return base.SavingChanges(eventData, result); + } + + public override ValueTask> SavingChangesAsync( + DbContextEventData eventData, + InterceptionResult result, + CancellationToken cancellationToken = default) + { + var auditContext = eventData.Context as IAuditContext ?? throw new Exception("Audit context is not set."); + + HandleEventData(eventData, auditContext); + + return base.SavingChangesAsync(eventData, result, cancellationToken); + } + + /// + /// Handles the event data for the creatable entities. + /// + /// + /// + private static void HandleEventData(DbContextEventData eventData, IAuditContext auditContext) + { + foreach (var entry in eventData.Context!.ChangeTracker.Entries()) { if (entry.State == EntityState.Deleted) { @@ -37,8 +63,6 @@ public override InterceptionResult SavingChanges( entry.Entity.DeletedSource = null; } } - return base.SavingChanges(data, result); } } - }