private void LocalDetectChanges(InternalEntityEntry entry) { var entityType = entry.EntityType; foreach (var property in entityType.GetProperties()) { if (property.GetOriginalValueIndex() >= 0 && !entry.IsModified(property) && !entry.IsConceptualNull(property)) { var current = entry[property]; var original = entry.GetOriginalValue(property); var comparer = property.GetValueComparer(); if (comparer == null) { if (!Equals(current, original)) { SetPropertyModified(); } } else if (!comparer.Equals(current, original)) { SetPropertyModified(); } void SetPropertyModified() { if (entry.EntityState == EntityState.Deleted) { ThrowIfKeyChanged(entry, property); } else { LogChangeDetected(entry, property, original, current); entry.SetPropertyModified(property); } } } } foreach (var property in entityType.GetProperties()) { DetectKeyChange(entry, property); } if (entry.HasRelationshipSnapshot) { foreach (var navigation in entityType.GetNavigations()) { DetectNavigationChange(entry, navigation); } foreach (var navigation in entityType.GetSkipNavigations()) { DetectNavigationChange(entry, navigation); } } }
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 && !entry.IsModified(property) && !entry.IsConceptualNull(property)) { DetectValueChange(entry, property); } DetectKeyChange(entry, property); } if (entry.HasRelationshipSnapshot) { foreach (var navigation in entityType.GetNavigations()) { DetectNavigationChange(entry, navigation); } foreach (var navigation in entityType.GetSkipNavigations()) { DetectNavigationChange(entry, navigation); } } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void DetectChanges(InternalEntityEntry entry) { var entityType = entry.EntityType; foreach (var property in entityType.GetProperties()) { if (property.GetOriginalValueIndex() >= 0 && !entry.IsModified(property) && !entry.IsConceptualNull(property)) { var current = entry[property]; var original = entry.GetOriginalValue(property); var comparer = property.GetValueComparer() ?? property.FindMapping()?.Comparer; if (comparer == null) { if (!Equals(current, original)) { LogChangeDetected(entry, property, original, current); entry.SetPropertyModified(property); } } else { if (!comparer.Equals(current, original)) { LogChangeDetected(entry, property, original, current); entry.SetPropertyModified(property); } } } } foreach (var property in entityType.GetProperties()) { DetectKeyChange(entry, property); } if (entry.HasRelationshipSnapshot) { foreach (var navigation in entityType.GetNavigations()) { DetectNavigationChange(entry, navigation); } } }