diff --git a/Disco.Data/Properties/AssemblyInfo.cs b/Disco.Data/Properties/AssemblyInfo.cs index 5ad2824a..3f730d9b 100644 --- a/Disco.Data/Properties/AssemblyInfo.cs +++ b/Disco.Data/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0506.1904")] -[assembly: AssemblyFileVersion("1.2.0506.1904")] \ No newline at end of file +[assembly: AssemblyVersion("1.2.0506.2022")] +[assembly: AssemblyFileVersion("1.2.0506.2022")] \ No newline at end of file diff --git a/Disco.Data/Repository/DiscoDataContext.cs b/Disco.Data/Repository/DiscoDataContext.cs index 317f0e0f..0b407358 100644 --- a/Disco.Data/Repository/DiscoDataContext.cs +++ b/Disco.Data/Repository/DiscoDataContext.cs @@ -73,8 +73,6 @@ namespace Disco.Data.Repository { int changeCount = 0; - this.ChangeTracker.DetectChanges(); - // Notify before changes are committed var changes = Monitor.RepositoryMonitor.BeforeSaveChanges(this); diff --git a/Disco.Data/Repository/Monitor/RepositoryMonitor.cs b/Disco.Data/Repository/Monitor/RepositoryMonitor.cs index 543606ef..8a7aa3d4 100644 --- a/Disco.Data/Repository/Monitor/RepositoryMonitor.cs +++ b/Disco.Data/Repository/Monitor/RepositoryMonitor.cs @@ -24,11 +24,13 @@ namespace Disco.Data.Repository.Monitor { var contextStateManager = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectStateManager; - var changes = contextStateManager.GetObjectStateEntries(System.Data.EntityState.Added).Concat(contextStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted)).Concat(contextStateManager.GetObjectStateEntries(System.Data.EntityState.Modified)); + dbContext.ChangeTracker.DetectChanges(); + var changes = dbContext.ChangeTracker.Entries().Where(entry => entry.State == System.Data.EntityState.Added || entry.State == System.Data.EntityState.Deleted || entry.State == System.Data.EntityState.Modified); var events = changes.Select(entryState => { - var monitorEvent = EventFromEntryState(entryState); + ObjectStateEntry stateEntry = contextStateManager.GetObjectStateEntry(entryState.Entity); + var monitorEvent = EventFromEntryState(dbContext, entryState, stateEntry); // Push to Stream streamBefore.OnNext(monitorEvent); @@ -40,12 +42,9 @@ namespace Disco.Data.Repository.Monitor } internal static void AfterSaveChanges(DiscoDataContext dbContext, IEnumerable changes) { - var contextStateManager = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectStateManager; - foreach (var change in changes) { - UpdateAfterEventFromEntryState(change, contextStateManager); - + UpdateAfterEventFromEntryState(change); streamAfter.OnNext(change); } } @@ -72,17 +71,16 @@ namespace Disco.Data.Repository.Monitor throw new ArgumentException("The EntryProxyType does not inherit from any Repository Models", "EntityProxyType"); } - internal static void UpdateAfterEventFromEntryState(RepositoryMonitorEvent monitorEvent, ObjectStateManager stateManager) + internal static void UpdateAfterEventFromEntryState(RepositoryMonitorEvent monitorEvent) { if (monitorEvent.EventType == RepositoryMonitorEventType.Added) { // Update Entity Key for Added Events - var entryState = stateManager.GetObjectStateEntry(monitorEvent.Entity); - monitorEvent.EntityKey = entryState.EntityKey.EntityKeyValues.Select(kv => kv.Value).ToArray(); + monitorEvent.EntityKey = monitorEvent.objectEntryState.EntityKey.EntityKeyValues.Select(kv => kv.Value).ToArray(); } } - internal static RepositoryMonitorEvent EventFromEntryState(ObjectStateEntry entryState) + internal static RepositoryMonitorEvent EventFromEntryState(DiscoDataContext dbContext, DbEntityEntry entityEntry, ObjectStateEntry entryState) { RepositoryMonitorEventType eventType; string[] modifiedProperties = null; @@ -126,7 +124,10 @@ namespace Disco.Data.Repository.Monitor Entity = entryState.Entity, EntityKey = entityKey, EntityType = entityType, - ModifiedProperties = modifiedProperties + ModifiedProperties = modifiedProperties, + dbContext = dbContext, + dbEntityState = entityEntry, + objectEntryState = entryState }; } }