private static void SetForeignKeyProperties( InternalEntityEntry dependentEntry, InternalEntityEntry principalEntry, IForeignKey foreignKey, bool setModified, bool fromQuery) { var principalProperties = foreignKey.PrincipalKey.Properties; var dependentProperties = foreignKey.Properties; for (var i = 0; i < foreignKey.Properties.Count; i++) { var principalProperty = principalProperties[i]; var dependentProperty = dependentProperties[i]; var principalValue = principalEntry[principalProperty]; var dependentValue = dependentEntry[dependentProperty]; if (!PrincipalValueEqualsDependentValue(principalProperty, dependentValue, principalValue) || (dependentEntry.IsConceptualNull(dependentProperty) && principalValue != null)) { if (principalEntry.HasTemporaryValue(principalProperty)) { dependentEntry.SetTemporaryValue(dependentProperty, principalValue, setModified); } else { dependentEntry.SetProperty(dependentProperty, principalValue, fromQuery, setModified); } dependentEntry.StateManager.UpdateDependentMap(dependentEntry, foreignKey); dependentEntry.SetRelationshipSnapshotValue(dependentProperty, principalValue); } } }
private static InternalEntityEntry TryPropagateValue(InternalEntityEntry entry, IProperty property) { var entityType = entry.EntityType; var stateManager = entry.StateManager; foreach (var foreignKey in entityType.GetForeignKeys()) { for (var propertyIndex = 0; propertyIndex < foreignKey.Properties.Count; propertyIndex++) { if (property == foreignKey.Properties[propertyIndex]) { // Remove when issue #749 is fixed var principal = foreignKey.DependentToPrincipal?.IsShadowProperty ?? true ? null : foreignKey.DependentToPrincipal.GetGetter().GetClrValue(entry.Entity); InternalEntityEntry principalEntry = null; if (principal != null) { principalEntry = stateManager.GetOrCreateEntry(principal); } else if (foreignKey.PrincipalToDependent != null) { foreach (var danglerEntry in stateManager.GetRecordedReferers(entry.Entity, clear: false)) { if (danglerEntry.Item1 == foreignKey.PrincipalToDependent) { principalEntry = danglerEntry.Item2; break; } } } if (principalEntry != null) { var principalProperty = foreignKey.PrincipalKey.Properties[propertyIndex]; var principalValue = principalEntry[principalProperty]; if (!principalProperty.ClrType.IsDefaultValue(principalValue)) { entry[property] = principalValue; if (principalEntry.HasTemporaryValue(principalProperty)) { entry.MarkAsTemporary(property); } else { entry.MarkAsTemporary(property, isTemporary: false); } return(principalEntry); } } break; } } } return(null); }
private static InternalEntityEntry TryPropagateValue(InternalEntityEntry entry, IProperty property) { var entityType = entry.EntityType; var stateManager = entry.StateManager; foreach (var foreignKey in entityType.GetForeignKeys()) { for (var propertyIndex = 0; propertyIndex < foreignKey.Properties.Count; propertyIndex++) { if (property == foreignKey.Properties[propertyIndex]) { var principal = foreignKey.DependentToPrincipal == null ? null : entry[foreignKey.DependentToPrincipal]; InternalEntityEntry principalEntry = null; if (principal != null) { principalEntry = stateManager.GetOrCreateEntry(principal, foreignKey.PrincipalEntityType); } else if (foreignKey.PrincipalToDependent != null) { foreach (var danglerEntry in stateManager.GetRecordedReferrers(entry.Entity, clear: false)) { if (danglerEntry.Item1 == foreignKey.PrincipalToDependent) { principalEntry = danglerEntry.Item2; break; } } } if (principalEntry != null) { var principalProperty = foreignKey.PrincipalKey.Properties[propertyIndex]; var principalValue = principalEntry[principalProperty]; if (!principalProperty.ClrType.IsDefaultValue(principalValue)) { if (principalEntry.HasTemporaryValue(principalProperty)) { entry.SetTemporaryValue(property, principalValue); } else { entry[property] = principalValue; } return(principalEntry); } } break; } } } return(null); }