diff --git a/Disco.Data/Repository/Monitor/RepositoryMonitor.cs b/Disco.Data/Repository/Monitor/RepositoryMonitor.cs index e165f9bd..fdcd6ff7 100644 --- a/Disco.Data/Repository/Monitor/RepositoryMonitor.cs +++ b/Disco.Data/Repository/Monitor/RepositoryMonitor.cs @@ -74,11 +74,18 @@ namespace Disco.Data.Repository.Monitor internal static void UpdateAfterEventFromEntryState(RepositoryMonitorEvent monitorEvent) { + monitorEvent.afterCommit = true; + if (monitorEvent.EventType == RepositoryMonitorEventType.Added) { // Update Entity Key for Added Events monitorEvent.EntityKey = DetermineEntityKey(monitorEvent.objectEntryState); } + + // Execute Deferred Actions + if (monitorEvent.executeAfterCommit != null) + foreach (var deferredAction in monitorEvent.executeAfterCommit) + deferredAction.Invoke(monitorEvent); } internal static RepositoryMonitorEvent EventFromEntryState(DiscoDataContext dbContext, DbEntityEntry entityEntry, ObjectStateEntry entryState) diff --git a/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs b/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs index 547d1338..467ff817 100644 --- a/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs +++ b/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs @@ -12,11 +12,13 @@ namespace Disco.Data.Repository.Monitor public class RepositoryMonitorEvent { [JsonIgnore] - internal ObjectStateEntry objectEntryState { get; set; } + internal ObjectStateEntry objectEntryState; [JsonIgnore] - internal DbEntityEntry dbEntityState { get; set; } + internal DbEntityEntry dbEntityState; [JsonIgnore] - internal bool afterCommit { get; set; } + internal bool afterCommit; + [JsonIgnore] + internal List> executeAfterCommit; [JsonIgnore] public DiscoDataContext dbContext { get; set; } @@ -44,7 +46,7 @@ namespace Disco.Data.Repository.Monitor public T GetPreviousPropertyValue(string PropertyName) { if (afterCommit) - throw new InvalidOperationException("Unable to determine property values after repository commit"); + throw new InvalidOperationException("Unable to determine property values after repository commit, use a deferred action instead"); else return (T)dbEntityState.OriginalValues[PropertyName]; } @@ -52,5 +54,20 @@ namespace Disco.Data.Repository.Monitor { return (T)dbEntityState.CurrentValues[PropertyName]; } + + public void ExecuteAfterCommit(Action action){ + if (afterCommit) + { + // Execute Immediately + action.Invoke(this); + } + else + { + // Defer Execution + if (executeAfterCommit == null) + executeAfterCommit = new List>(); + executeAfterCommit.Add(action); + } + } } }