public virtual void SetPropertyModified([NotNull] IProperty property, bool isModified = true) { Check.NotNull(property, "property"); // TODO: Restore original value to reject changes when isModified is false var currentState = _stateData.EntityState; if (currentState != EntityState.Modified && currentState != EntityState.Unchanged) { return; } _stateData.FlagProperty(property.Index, isModified); // Don't change entity state if it is Added or Deleted if (isModified && currentState == EntityState.Unchanged) { var notifier = _configuration.Services.StateEntryNotifier; notifier.StateChanging(this, EntityState.Modified); _stateData.EntityState = EntityState.Modified; notifier.StateChanged(this, currentState); } else if (!isModified && !_stateData.AnyPropertiesFlagged()) { var notifier = _configuration.Services.StateEntryNotifier; notifier.StateChanging(this, EntityState.Unchanged); _stateData.EntityState = EntityState.Unchanged; notifier.StateChanged(this, currentState); } }
public virtual void SetPropertyModified([NotNull] IProperty property, bool isModified = true) { Check.NotNull(property, "property"); // TODO: Restore original value to reject changes when isModified is false // Issue #742 var currentState = _stateData.EntityState; if (currentState == EntityState.Added || currentState == EntityState.Unknown) { MarkAsTemporary(property, isTemporary: false); OriginalValues.TakeSnapshot(property); } if ((currentState != EntityState.Modified && currentState != EntityState.Unchanged) // TODO: Consider allowing computed properties to be forcibly marked as modified // Issue #711 || property.IsStoreComputed) { return; } if (isModified && property.IsReadOnly) { throw new NotSupportedException(Strings.PropertyReadOnly(property.Name, EntityType.Name)); } _stateData.FlagProperty(property.Index, isModified); // Don't change entity state if it is Added or Deleted if (isModified && currentState == EntityState.Unchanged) { StateManager.Notify.StateChanging(this, EntityState.Modified); _stateData.EntityState = EntityState.Modified; StateManager.Notify.StateChanged(this, currentState); } else if (!isModified && !_stateData.AnyPropertiesFlagged()) { StateManager.Notify.StateChanging(this, EntityState.Unchanged); _stateData.EntityState = EntityState.Unchanged; StateManager.Notify.StateChanged(this, currentState); } }
public virtual void SetPropertyModified([NotNull] IProperty property, bool isModified = true) { // TODO: Restore original value to reject changes when isModified is false // Issue #742 var currentState = _stateData.EntityState; if ((currentState == EntityState.Added) || (currentState == EntityState.Detached)) { MarkAsTemporary(property, isTemporary: false); SetOriginalValue(property, this[property]); } if ((currentState != EntityState.Modified) && (currentState != EntityState.Unchanged)) { return; } if (isModified && property.IsKey()) { throw new NotSupportedException(CoreStrings.KeyReadOnly(property.Name, EntityType.DisplayName())); } _stateData.FlagProperty(property.GetIndex(), PropertyFlag.TemporaryOrModified, isModified); // Don't change entity state if it is Added or Deleted if (isModified && (currentState == EntityState.Unchanged)) { StateManager.Notify.StateChanging(this, EntityState.Modified); _stateData.EntityState = EntityState.Modified; StateManager.SingleQueryMode = false; StateManager.Notify.StateChanged(this, currentState, skipInitialFixup: false); } else if (!isModified && !_stateData.AnyPropertiesFlagged(PropertyFlag.TemporaryOrModified)) { StateManager.Notify.StateChanging(this, EntityState.Unchanged); _stateData.EntityState = EntityState.Unchanged; StateManager.Notify.StateChanged(this, currentState, skipInitialFixup: false); } }
public virtual void SetPropertyModified([NotNull] IProperty property, bool isModified = true) { // TODO: Restore original value to reject changes when isModified is false // Issue #742 var currentState = _stateData.EntityState; if (currentState == EntityState.Added || currentState == EntityState.Detached) { MarkAsTemporary(property, isTemporary: false); OriginalValues.TakeSnapshot(property); } if (currentState != EntityState.Modified && currentState != EntityState.Unchanged) { return; } if (isModified && property.IsKey()) { throw new NotSupportedException(Strings.KeyReadOnly(property.Name, EntityType.DisplayName())); } _stateData.FlagProperty(property.Index, isModified); // Don't change entity state if it is Added or Deleted if (isModified && currentState == EntityState.Unchanged) { StateManager.Notify.StateChanging(this, EntityState.Modified); _stateData.EntityState = EntityState.Modified; StateManager.Notify.StateChanged(this, currentState); } else if (!isModified && !_stateData.AnyPropertiesFlagged()) { StateManager.Notify.StateChanging(this, EntityState.Unchanged); _stateData.EntityState = EntityState.Unchanged; StateManager.Notify.StateChanged(this, currentState); } }
public virtual void SetPropertyModified([NotNull] IProperty property, bool isModified = true) { Check.NotNull(property, "property"); // TODO: Restore original value to reject changes when isModified is false // Issue #742 var currentState = _stateData.EntityState; if ((currentState != EntityState.Modified && currentState != EntityState.Unchanged) // TODO: Consider allowing computed properties to be forcibly marked as modified // Issue #711 || property.ValueGeneration == ValueGeneration.OnAddAndUpdate) { return; } if (isModified && property.IsReadOnly) { throw new NotSupportedException(Strings.FormatPropertyReadOnly(property.Name, EntityType.Name)); } _stateData.FlagProperty(property.Index, isModified); // Don't change entity state if it is Added or Deleted if (isModified && currentState == EntityState.Unchanged) { var notifier = _configuration.Services.StateEntryNotifier; notifier.StateChanging(this, EntityState.Modified); _stateData.EntityState = EntityState.Modified; notifier.StateChanged(this, currentState); } else if (!isModified && !_stateData.AnyPropertiesFlagged()) { var notifier = _configuration.Services.StateEntryNotifier; notifier.StateChanging(this, EntityState.Unchanged); _stateData.EntityState = EntityState.Unchanged; notifier.StateChanged(this, currentState); } }
/// <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 SetPropertyModified( [NotNull] IProperty property, bool changeState = true, bool isModified = true, bool isConceptualNull = false) { var propertyIndex = property.GetIndex(); _stateData.FlagProperty(propertyIndex, PropertyFlag.Unknown, false); var currentState = _stateData.EntityState; if (currentState == EntityState.Added || currentState == EntityState.Detached || !changeState) { object _; if (!_storeGeneratedValues.TryGetValue(property, out _)) { MarkAsTemporary(property, isTemporary: false); var index = property.GetOriginalValueIndex(); if (index != -1) { SetOriginalValue(property, this[property], index); } } } if (currentState == EntityState.Added || currentState == EntityState.Deleted) { return; } if (changeState && !isConceptualNull && isModified && property.IsKey()) { throw new InvalidOperationException(CoreStrings.KeyReadOnly(property.Name, EntityType.DisplayName())); } if (changeState) { if (!isModified && currentState != EntityState.Detached && property.GetOriginalValueIndex() != -1) { SetProperty(property, GetOriginalValue(property), setModified: false); } _stateData.FlagProperty(propertyIndex, PropertyFlag.TemporaryOrModified, isModified); } if (isModified && (currentState == EntityState.Unchanged || currentState == EntityState.Detached)) { if (changeState) { StateManager.Notify.StateChanging(this, EntityState.Modified); _stateData.EntityState = EntityState.Modified; } StateManager.EndSingleQueryMode(); if (changeState) { StateManager.ChangedCount++; StateManager.Notify.StateChanged(this, currentState, fromQuery: false); } } else if (currentState != EntityState.Detached && changeState && !isModified && !_stateData.AnyPropertiesFlagged(PropertyFlag.TemporaryOrModified)) { StateManager.Notify.StateChanging(this, EntityState.Unchanged); _stateData.EntityState = EntityState.Unchanged; StateManager.ChangedCount--; StateManager.Notify.StateChanged(this, currentState, fromQuery: false); } }
public virtual void SetPropertyModified( [NotNull] IProperty property, bool changeState = true, bool isModified = true) { // TODO: Restore original value to reject changes when isModified is false // Issue #742 var propertyIndex = property.GetIndex(); _stateData.FlagProperty(propertyIndex, PropertyFlag.Unknown, false); var currentState = _stateData.EntityState; if (currentState == EntityState.Added || currentState == EntityState.Detached || !changeState) { MarkAsTemporary(property, isTemporary: false); var index = property.GetOriginalValueIndex(); if (index != -1) { SetOriginalValue(property, this[property], index); } } if (currentState != EntityState.Modified && currentState != EntityState.Unchanged) { return; } if (changeState && isModified && property.IsKey()) { throw new InvalidOperationException(CoreStrings.KeyReadOnly(property.Name, EntityType.DisplayName())); } if (changeState) { _stateData.FlagProperty(propertyIndex, PropertyFlag.TemporaryOrModified, isModified); } // Don't change entity state if it is Added or Deleted if (isModified && currentState == EntityState.Unchanged) { if (changeState) { StateManager.Notify.StateChanging(this, EntityState.Modified); _stateData.EntityState = EntityState.Modified; } StateManager.SingleQueryMode = false; if (changeState) { StateManager.Notify.StateChanged(this, currentState, skipInitialFixup: false, fromQuery: false); } } else if (changeState && !isModified && !_stateData.AnyPropertiesFlagged(PropertyFlag.TemporaryOrModified)) { StateManager.Notify.StateChanging(this, EntityState.Unchanged); _stateData.EntityState = EntityState.Unchanged; StateManager.Notify.StateChanged(this, currentState, skipInitialFixup: false, fromQuery: false); } }