Fix: Repository Monitor Detached Head Fix

Fix from detached head merge error.
This commit is contained in:
Gary Sharp
2013-05-06 20:29:07 +10:00
parent d63b9ebc4e
commit 1f702796e6
3 changed files with 14 additions and 15 deletions
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0506.1904")] [assembly: AssemblyVersion("1.2.0506.2022")]
[assembly: AssemblyFileVersion("1.2.0506.1904")] [assembly: AssemblyFileVersion("1.2.0506.2022")]
@@ -73,8 +73,6 @@ namespace Disco.Data.Repository
{ {
int changeCount = 0; int changeCount = 0;
this.ChangeTracker.DetectChanges();
// Notify before changes are committed // Notify before changes are committed
var changes = Monitor.RepositoryMonitor.BeforeSaveChanges(this); var changes = Monitor.RepositoryMonitor.BeforeSaveChanges(this);
@@ -24,11 +24,13 @@ namespace Disco.Data.Repository.Monitor
{ {
var contextStateManager = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectStateManager; 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 events = changes.Select(entryState =>
{ {
var monitorEvent = EventFromEntryState(entryState); ObjectStateEntry stateEntry = contextStateManager.GetObjectStateEntry(entryState.Entity);
var monitorEvent = EventFromEntryState(dbContext, entryState, stateEntry);
// Push to Stream // Push to Stream
streamBefore.OnNext(monitorEvent); streamBefore.OnNext(monitorEvent);
@@ -40,12 +42,9 @@ namespace Disco.Data.Repository.Monitor
} }
internal static void AfterSaveChanges(DiscoDataContext dbContext, IEnumerable<RepositoryMonitorEvent> changes) internal static void AfterSaveChanges(DiscoDataContext dbContext, IEnumerable<RepositoryMonitorEvent> changes)
{ {
var contextStateManager = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectStateManager;
foreach (var change in changes) foreach (var change in changes)
{ {
UpdateAfterEventFromEntryState(change, contextStateManager); UpdateAfterEventFromEntryState(change);
streamAfter.OnNext(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"); 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) if (monitorEvent.EventType == RepositoryMonitorEventType.Added)
{ {
// Update Entity Key for Added Events // Update Entity Key for Added Events
var entryState = stateManager.GetObjectStateEntry(monitorEvent.Entity); monitorEvent.EntityKey = monitorEvent.objectEntryState.EntityKey.EntityKeyValues.Select(kv => kv.Value).ToArray();
monitorEvent.EntityKey = entryState.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; RepositoryMonitorEventType eventType;
string[] modifiedProperties = null; string[] modifiedProperties = null;
@@ -126,7 +124,10 @@ namespace Disco.Data.Repository.Monitor
Entity = entryState.Entity, Entity = entryState.Entity,
EntityKey = entityKey, EntityKey = entityKey,
EntityType = entityType, EntityType = entityType,
ModifiedProperties = modifiedProperties ModifiedProperties = modifiedProperties,
dbContext = dbContext,
dbEntityState = entityEntry,
objectEntryState = entryState
}; };
} }
} }