From bbef15a09bbfce2da98c6e20ca6d04108b3fa89e Mon Sep 17 00:00:00 2001 From: ajcvickers Date: Mon, 7 Sep 2020 14:58:12 -0700 Subject: [PATCH] Stop attempting to do local DetectChanges when not snapshot change-tracking Fixes #21835 --- .../ChangeTracking/Internal/ChangeDetector.cs | 8 ++++++-- .../Internal/ChangeDetectorTest.cs | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/EFCore/ChangeTracking/Internal/ChangeDetector.cs b/src/EFCore/ChangeTracking/Internal/ChangeDetector.cs index 0f5c632c78c..884dcf902b1 100644 --- a/src/EFCore/ChangeTracking/Internal/ChangeDetector.cs +++ b/src/EFCore/ChangeTracking/Internal/ChangeDetector.cs @@ -156,8 +156,7 @@ public virtual void DetectChanges(IStateManager stateManager) foreach (var entry in stateManager.ToList()) // Might be too big, but usually _all_ entities are using Snapshot tracking { - if (entry.EntityType.GetChangeTrackingStrategy() == ChangeTrackingStrategy.Snapshot - && entry.EntityState != EntityState.Detached) + if (entry.EntityState != EntityState.Detached) { LocalDetectChanges(entry); } @@ -199,6 +198,11 @@ private void LocalDetectChanges(InternalEntityEntry entry) { var entityType = entry.EntityType; + if (entry.EntityType.GetChangeTrackingStrategy() != ChangeTrackingStrategy.Snapshot) + { + return; + } + foreach (var property in entityType.GetProperties()) { if (property.GetOriginalValueIndex() >= 0 diff --git a/test/EFCore.Tests/ChangeTracking/Internal/ChangeDetectorTest.cs b/test/EFCore.Tests/ChangeTracking/Internal/ChangeDetectorTest.cs index 37c7e332a0b..b59cab95f74 100644 --- a/test/EFCore.Tests/ChangeTracking/Internal/ChangeDetectorTest.cs +++ b/test/EFCore.Tests/ChangeTracking/Internal/ChangeDetectorTest.cs @@ -390,6 +390,25 @@ public void Skips_detection_of_scalar_property_change_for_notification_entities( Assert.False(entry.IsModified(entry.EntityType.FindProperty("Name"))); } + [ConditionalFact] + public void Skips_local_detection_of_scalar_property_change_for_notification_entities() + { + var contextServices = InMemoryTestHelpers.Instance.CreateContextServices(BuildModelWithChanged()); + + var changeDetector = contextServices.GetRequiredService(); + + var category = new CategoryWithChanged { Id = 1, Name = "Oculus Rift" }; + var entry = contextServices.GetRequiredService().GetOrCreateEntry(category); + entry.SetEntityState(EntityState.Unchanged); + + category.Name = "Gear VR"; + + changeDetector.DetectChanges(entry); + + Assert.Equal(EntityState.Unchanged, entry.EntityState); + Assert.False(entry.IsModified(entry.EntityType.FindProperty("Name"))); + } + [ConditionalFact] public void Detects_principal_key_change() {