From f8613aa5d3885d7e14cab508cc3bc0fc875bfa86 Mon Sep 17 00:00:00 2001 From: Marc Drexler Date: Sun, 28 Aug 2016 11:29:27 +0200 Subject: [PATCH 1/2] Added Many-to-Many test --- .../ChangeTrackingCollectionTests.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Source/Tests/TrackableEntities.Client.Tests/ChangeTrackingCollectionTests.cs b/Source/Tests/TrackableEntities.Client.Tests/ChangeTrackingCollectionTests.cs index 1ce56dca..7f18f24a 100644 --- a/Source/Tests/TrackableEntities.Client.Tests/ChangeTrackingCollectionTests.cs +++ b/Source/Tests/TrackableEntities.Client.Tests/ChangeTrackingCollectionTests.cs @@ -152,6 +152,24 @@ public void Added_Employee_After_Tracking_Enabled_Should_Not_Mark_Manually_Added Assert.Equal(TrackingState.Added, employee.TrackingState); Assert.True(employee.Territories.All(t => t.TrackingState == TrackingState.Added)); } + + [Fact] + public void Adding_And_Removing_The_Same_Territory_Should_Not_Keep_Added_Territory_In_Territory_Collection() + { + // Arrange + var database = new MockNorthwind(); + var employee = database.Employees[0]; + var changeTracker = new ChangeTrackingCollection(employee); + + // Act + employee.Territories.Add(database.Territories[4]); + employee.Territories.Remove(database.Territories[4]); + + // Assert + var changes = changeTracker.GetChanges(); + Assert.Equal(0, changes.Count); + Assert.Equal(3, employee.Territories.Count); + } #endregion From 17ad6b9813e1aa99f3dd99b5d6843b71a4022d5f Mon Sep 17 00:00:00 2001 From: Anthony Sneed Date: Tue, 30 Aug 2016 09:04:42 +0200 Subject: [PATCH 2/2] Added following test in ChangeTrackingCollectionTests: Adding_And_Removing_The_Same_Territory_Should_Not_Keep_Added_Territory_In_Territory_Collection Updated RemoveItem in ChangeTrackingCollection so that removed m-m items with TrackingState.Added are not cached in the _deleted collection. Test now passes. --- Source/TrackableEntities.Client/ChangeTrackingCollection.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/TrackableEntities.Client/ChangeTrackingCollection.cs b/Source/TrackableEntities.Client/ChangeTrackingCollection.cs index 076ba024..c427f9b3 100644 --- a/Source/TrackableEntities.Client/ChangeTrackingCollection.cs +++ b/Source/TrackableEntities.Client/ChangeTrackingCollection.cs @@ -235,6 +235,7 @@ protected override void RemoveItem(int index) item.SetTracking(false, visitationHelper.Clone(), true); // Mark item and trackable collection properties + bool manyToManyAdded = Parent != null && item.TrackingState == TrackingState.Added; item.SetState(TrackingState.Deleted, visitationHelper.Clone()); // Fire EntityChanged event @@ -242,6 +243,7 @@ protected override void RemoveItem(int index) // Cache deleted item if not added or already cached if (item.TrackingState != TrackingState.Added + && !manyToManyAdded && !_deletedEntities.Contains(item)) _deletedEntities.Add(item); }