private InternalRelationshipBuilder ReuniquifyTemporaryProperties(ForeignKey foreignKey, bool force) { if (!force && (foreignKey.GetForeignKeyPropertiesConfigurationSource() != null || !foreignKey.DeclaringEntityType.Builder.ShouldReuniquifyTemporaryProperties( foreignKey.Properties, foreignKey.PrincipalKey.Properties, foreignKey.IsRequired && foreignKey.GetIsRequiredConfigurationSource().Overrides(ConfigurationSource.Convention), GetPropertyBaseName(foreignKey)))) { return(foreignKey.Builder); } var relationshipBuilder = foreignKey.Builder; using (var batch = foreignKey.DeclaringEntityType.Model.ConventionDispatcher.StartBatch()) { var temporaryProperties = foreignKey.Properties.Where( p => p.IsShadowProperty && ConfigurationSource.Convention.Overrides(p.GetConfigurationSource())).ToList(); var keysToDetach = temporaryProperties.SelectMany( p => p.GetContainingKeys() .Where(k => ConfigurationSource.Convention.Overrides(k.GetConfigurationSource()))) .Distinct().ToList(); List <RelationshipSnapshot> detachedRelationships = null; foreach (var key in keysToDetach) { foreach (var referencingForeignKey in key.GetReferencingForeignKeys().ToList()) { if (detachedRelationships == null) { detachedRelationships = new List <RelationshipSnapshot>(); } detachedRelationships.Add(InternalEntityTypeBuilder.DetachRelationship(referencingForeignKey)); } } var detachedKeys = InternalEntityTypeBuilder.DetachKeys(keysToDetach); var detachedIndexes = InternalEntityTypeBuilder.DetachIndexes( temporaryProperties.SelectMany(p => p.GetContainingIndexes()).Distinct()); relationshipBuilder = relationshipBuilder.HasForeignKey((IReadOnlyList <Property>)null, ConfigurationSource.Convention); if (detachedIndexes != null) { foreach (var indexBuilderTuple in detachedIndexes) { indexBuilderTuple.Attach(indexBuilderTuple.Metadata.DeclaringEntityType.Builder); } } if (detachedKeys != null) { foreach (var detachedKeyTuple in detachedKeys) { detachedKeyTuple.Item1.Attach(foreignKey.DeclaringEntityType.RootType().Builder, detachedKeyTuple.Item2); } } if (detachedRelationships != null) { foreach (var detachedRelationship in detachedRelationships) { detachedRelationship.Attach(); } } return(batch.Run(relationshipBuilder)); } }