Ejemplo n.º 1
0
        private void SetEntityState(EntityState oldState, EntityState newState)
        {
            // The entity state can be Modified even if some properties are not modified so always
            // set all properties to modified if the entity state is explicitly set to Modified.
            if (newState == EntityState.Modified)
            {
                _stateData.FlagAllProperties(EntityType.Properties.Count(), isFlagged: true);

                foreach (var keyProperty in EntityType.Properties.Where(
                             p => p.IsReadOnly ||
                             p.IsStoreComputed))
                {
                    _stateData.FlagProperty(keyProperty.Index, isFlagged: false);
                }
            }

            if (oldState == newState)
            {
                return;
            }

            // An Added entity does not yet exist in the database. If it is then marked as deleted there is
            // nothing to delete because it was not yet inserted, so just make sure it doesn't get inserted.
            if (oldState == EntityState.Added &&
                newState == EntityState.Deleted)
            {
                newState = EntityState.Unknown;
            }

            if (newState == EntityState.Unchanged)
            {
                _stateData.FlagAllProperties(EntityType.Properties.Count(), isFlagged: false);
            }

            StateManager.Notify.StateChanging(this, newState);

            _stateData.EntityState = newState;

            if (oldState == EntityState.Unknown)
            {
                StateManager.StartTracking(this);
            }
            else if (newState == EntityState.Unknown)
            {
                if (oldState == EntityState.Added)
                {
                    foreach (var property in EntityType.Properties.Where(p => _stateData.IsPropertyFlagged(p.Index)))
                    {
                        this[property] = property.PropertyType.GetDefaultValue();
                    }
                }

                // TODO: Does changing to Unknown really mean stop tracking?
                // Issue #323
                StateManager.StopTracking(this);
            }

            StateManager.Notify.StateChanged(this, oldState);
        }