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); } } }
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(entityType.GetProperties().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, dependentEndNavigationPropertyName); var principalEndNavigationPropertyName = CSharpUtilities.Instance.GenerateCSharpIdentifier( principalEndNavigationPropertyCandidateName, principalEndExistingIdentifiers, NavigationUniquifier); foreignKey.Scaffolding().PrincipalEndNavigation = principalEndNavigationPropertyName; principalEndExistingIdentifiers.Add(principalEndNavigationPropertyName); } } }