protected virtual void VisitNavigationProperties([NotNull] ModelBuilder modelBuilder) { Check.NotNull(modelBuilder, nameof(modelBuilder)); // TODO perf cleanup can we do this in 1 loop instead of 2? var model = modelBuilder.Model; var modelUtilities = new ModelUtilities(); var entityTypeToExistingIdentifiers = new Dictionary <IEntityType, List <string> >(); foreach (var entityType in model.GetEntityTypes()) { var existingIdentifiers = new List <string>(); entityTypeToExistingIdentifiers.Add(entityType, existingIdentifiers); existingIdentifiers.Add(entityType.Name); existingIdentifiers.AddRange( modelUtilities.OrderedProperties(entityType).Select(p => p.Name)); } foreach (var entityType in model.GetEntityTypes()) { var dependentEndExistingIdentifiers = entityTypeToExistingIdentifiers[entityType]; foreach (var foreignKey in entityType.GetForeignKeys()) { // set up the name of the navigation property on the dependent end of the foreign key var dependentEndNavigationPropertyCandidateName = modelUtilities.GetDependentEndCandidateNavigationPropertyName(foreignKey); var dependentEndNavigationPropertyName = CSharpUtilities.Instance.GenerateCSharpIdentifier( dependentEndNavigationPropertyCandidateName, dependentEndExistingIdentifiers, NavigationUniquifier); foreignKey.Scaffolding().DependentEndNavigation = dependentEndNavigationPropertyName; dependentEndExistingIdentifiers.Add(dependentEndNavigationPropertyName); // set up the name of the navigation property on the principal end of the foreign key var principalEndExistingIdentifiers = entityTypeToExistingIdentifiers[foreignKey.PrincipalEntityType]; var principalEndNavigationPropertyCandidateName = foreignKey.IsSelfReferencing() ? string.Format( CultureInfo.CurrentCulture, SelfReferencingPrincipalEndNavigationNamePattern, dependentEndNavigationPropertyName) : modelUtilities.GetPrincipalEndCandidateNavigationPropertyName(foreignKey); var principalEndNavigationPropertyName = CSharpUtilities.Instance.GenerateCSharpIdentifier( principalEndNavigationPropertyCandidateName, principalEndExistingIdentifiers, NavigationUniquifier); foreignKey.Scaffolding().PrincipalEndNavigation = principalEndNavigationPropertyName; principalEndExistingIdentifiers.Add(principalEndNavigationPropertyName); } } }
private void AddDependentAndPrincipalNavigationPropertyAnnotations([NotNull] IModel codeGenModel) { Check.NotNull(codeGenModel, nameof(codeGenModel)); var entityTypeToExistingIdentifiers = new Dictionary <IEntityType, List <string> >(); foreach (var entityType in codeGenModel.EntityTypes) { var existingIdentifiers = new List <string>(); entityTypeToExistingIdentifiers.Add(entityType, existingIdentifiers); existingIdentifiers.Add(entityType.Name); existingIdentifiers.AddRange( _modelUtilities.OrderedProperties(entityType).Select(p => p.Name)); } foreach (var entityType in codeGenModel.EntityTypes) { var dependentEndExistingIdentifiers = entityTypeToExistingIdentifiers[entityType]; foreach (var foreignKey in entityType.GetForeignKeys().Cast <ForeignKey>()) { // set up the name of the navigation property on the dependent end of the foreign key var dependentEndNavigationPropertyCandidateName = _modelUtilities.GetDependentEndCandidateNavigationPropertyName(foreignKey); var dependentEndNavigationPropertyName = CSharpUtilities.Instance.GenerateCSharpIdentifier( dependentEndNavigationPropertyCandidateName, dependentEndExistingIdentifiers, NavigationUniquifier); foreignKey.AddAnnotation( AnnotationNameDependentEndNavPropName, dependentEndNavigationPropertyName); dependentEndExistingIdentifiers.Add(dependentEndNavigationPropertyName); // set up the name of the navigation property on the principal end of the foreign key var principalEndExistingIdentifiers = entityTypeToExistingIdentifiers[foreignKey.PrincipalEntityType]; var principalEndNavigationPropertyCandidateName = foreignKey.IsSelfReferencing() ? string.Format( CultureInfo.CurrentCulture, SelfReferencingPrincipalEndNavigationNamePattern, dependentEndNavigationPropertyName) : _modelUtilities.GetPrincipalEndCandidateNavigationPropertyName(foreignKey); var principalEndNavigationPropertyName = CSharpUtilities.Instance.GenerateCSharpIdentifier( principalEndNavigationPropertyCandidateName, principalEndExistingIdentifiers, NavigationUniquifier); foreignKey.AddAnnotation( AnnotationNamePrincipalEndNavPropName, principalEndNavigationPropertyName); principalEndExistingIdentifiers.Add(principalEndNavigationPropertyName); } } }
public virtual void AddEntityPropertiesConfiguration([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); foreach (var property in ModelUtilities.OrderedProperties(entityConfiguration.EntityType)) { var propertyConfiguration = new PropertyConfiguration(entityConfiguration, property); AddPropertyConfiguration(propertyConfiguration); entityConfiguration.PropertyConfigurations.Add(propertyConfiguration); } }