private IReadOnlyList <Property> FindMatchingNonShadowProperties(InternalRelationshipBuilder relationshipBuilder, string baseName, bool onDependent) { var foreignKey = relationshipBuilder.Metadata; var entityType = onDependent ? foreignKey.DeclaringEntityType : foreignKey.PrincipalEntityType; var propertiesToReference = onDependent ? foreignKey.PrincipalKey.Properties : foreignKey.DeclaringEntityType.FindPrimaryKey()?.Properties; if (propertiesToReference == null) { return(null); } var foreignKeyProperties = new List <Property>(); foreach (IProperty referencedProperty in propertiesToReference) { var property = TryGetProperty(entityType, baseName + referencedProperty.Name, referencedProperty.ClrType.UnwrapNullableType()); if (property != null) { foreignKeyProperties.Add(property); } } if (propertiesToReference.Count == 1 && foreignKeyProperties.Count == 0) { var property = TryGetProperty(entityType, baseName + "Id", ((IProperty)propertiesToReference.Single()).ClrType.UnwrapNullableType()); if (property != null) { foreignKeyProperties.Add(property); } } if (foreignKeyProperties.Count < propertiesToReference.Count) { return(null); } if (!relationshipBuilder.CanSetForeignKey(foreignKeyProperties, ConfigurationSource.Convention)) { return(null); } var primaryKey = entityType.FindPrimaryKey(); if (primaryKey != null) { if (foreignKeyProperties.All(property => primaryKey.Properties.Contains(property))) { return(null); } } return(foreignKeyProperties); }
private IReadOnlyList<Property> FindMatchingNonShadowProperties(InternalRelationshipBuilder relationshipBuilder, string baseName, bool onDependent) { var foreignKey = relationshipBuilder.Metadata; var entityType = onDependent ? foreignKey.DeclaringEntityType : foreignKey.PrincipalEntityType; var propertiesToReference = onDependent ? foreignKey.PrincipalKey.Properties : foreignKey.DeclaringEntityType.FindPrimaryKey()?.Properties; if (propertiesToReference == null) { return null; } var foreignKeyProperties = new List<Property>(); foreach (IProperty referencedProperty in propertiesToReference) { var property = TryGetProperty(entityType, baseName + referencedProperty.Name, referencedProperty.ClrType.UnwrapNullableType()); if (property != null) { foreignKeyProperties.Add(property); } } if (propertiesToReference.Count == 1 && foreignKeyProperties.Count == 0) { var property = TryGetProperty(entityType, baseName + "Id", ((IProperty)propertiesToReference.Single()).ClrType.UnwrapNullableType()); if (property != null) { foreignKeyProperties.Add(property); } } if (foreignKeyProperties.Count < propertiesToReference.Count) { return null; } if (!relationshipBuilder.CanSetForeignKey(foreignKeyProperties, ConfigurationSource.Convention)) { return null; } var primaryKey = entityType.FindPrimaryKey(); if (primaryKey != null) { if (foreignKeyProperties.All(property => primaryKey.Properties.Contains(property))) { return null; } } return foreignKeyProperties; }