public virtual void StateChanged(StateEntry entry, EntityState oldState) { Check.NotNull(entry, "entry"); Check.IsDefined(oldState, "oldState"); // TODO: Lots to do here; for now just fixup references when entity begins tracking if (oldState != EntityState.Unknown) { return; } // Handle case where the new entity is the dependent foreach (var foreignKey in entry.EntityType.ForeignKeys) { var principalEntry = _stateManager.GetPrincipal(entry, foreignKey); if (principalEntry != null) { DoFixup(foreignKey, principalEntry, new[] { entry }); } } // Handle case where the new entity is the principal foreach (var foreignKey in _stateManager.Model.EntityTypes.SelectMany( e => e.ForeignKeys.Where(f => f.ReferencedEntityType == entry.EntityType))) { var dependents = _stateManager.GetDependents(entry, foreignKey).ToArray(); if (dependents.Length > 0) { DoFixup(foreignKey, entry, dependents); } } }
public virtual void ForeignKeyPropertyChanged(StateEntry entry, IProperty property, object oldValue, object newValue) { Check.NotNull(entry, "entry"); Check.NotNull(property, "property"); foreach (var foreignKey in entry.EntityType.ForeignKeys.Where(p => p.Properties.Contains(property)).Distinct()) { var oldPrincipalEntry = _stateManager.GetPrincipal(entry, foreignKey, useForeignKeySnapshot: true); if (oldPrincipalEntry != null) { UndoFixup(foreignKey, oldPrincipalEntry, entry); } var principalEntry = _stateManager.GetPrincipal(entry, foreignKey, useForeignKeySnapshot: false); if (principalEntry != null) { DoFixup(foreignKey, principalEntry, new[] { entry }); } } }