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);
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        /// <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);
            }
        }