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() {