public override IConventionNavigation OnNavigationAdded( IConventionRelationshipBuilder relationshipBuilder, IConventionNavigation navigation) { if (relationshipBuilder.Metadata.Builder == null || relationshipBuilder.Metadata.GetNavigation(navigation.IsDependentToPrincipal()) != navigation) { return(null); } using (_dispatcher.DelayConventions()) { _navigationConventionContext.ResetState(navigation); foreach (var navigationConvention in _conventionSet.NavigationAddedConventions) { navigationConvention.ProcessNavigationAdded(relationshipBuilder, navigation, _navigationConventionContext); if (_navigationConventionContext.ShouldStopProcessing()) { return(_navigationConventionContext.Result); } } } if (relationshipBuilder.Metadata.GetNavigation(navigation.IsDependentToPrincipal()) != navigation) { return(null); } return(navigation); }
/// <summary> /// Called after a navigation property that has an attribute is added to an entity type. /// </summary> /// <param name="relationshipBuilder"> The builder for the relationship. </param> /// <param name="navigation"> The navigation. </param> /// <param name="attribute"> The attribute. </param> /// <param name="context"> Additional information associated with convention execution. </param> public override void ProcessNavigationAdded( IConventionRelationshipBuilder relationshipBuilder, IConventionNavigation navigation, InversePropertyAttribute attribute, IConventionContext <IConventionNavigation> context) { if (relationshipBuilder.Metadata.DeclaringEntityType.HasDefiningNavigation() || relationshipBuilder.Metadata.DeclaringEntityType.IsOwned() || relationshipBuilder.Metadata.PrincipalEntityType.HasDefiningNavigation() || relationshipBuilder.Metadata.PrincipalEntityType.IsOwned()) { return; } var newRelationship = ConfigureInverseNavigation( navigation.DeclaringEntityType.Builder, navigation.GetIdentifyingMemberInfo(), navigation.GetTargetType().Builder, attribute); if (newRelationship != relationshipBuilder) { if (newRelationship == null) { context.StopProcessingIfChanged(null); return; } var newNavigation = navigation.IsDependentToPrincipal() ? newRelationship.Metadata.DependentToPrincipal : newRelationship.Metadata.PrincipalToDependent; context.StopProcessingIfChanged(newNavigation); } }
/// <summary> /// Called after a navigation is added to the entity type. /// </summary> /// <param name="relationshipBuilder"> The builder for the foreign key. </param> /// <param name="navigation"> The navigation. </param> /// <param name="context"> Additional information associated with convention execution. </param> public virtual void ProcessNavigationAdded( IConventionRelationshipBuilder relationshipBuilder, IConventionNavigation navigation, IConventionContext <IConventionNavigation> context) { var field = GetFieldToSet(navigation); if (field != null) { relationshipBuilder.HasField(field, navigation.IsDependentToPrincipal()); } }
/// <summary> /// Called after a navigation is added to the entity type. /// </summary> /// <param name="relationshipBuilder"> The builder for the foreign key. </param> /// <param name="navigation"> The navigation. </param> /// <param name="context"> Additional information associated with convention execution. </param> public virtual void ProcessNavigationAdded( IConventionRelationshipBuilder relationshipBuilder, IConventionNavigation navigation, IConventionContext <IConventionNavigation> context) { Check.NotNull(relationshipBuilder, nameof(relationshipBuilder)); Check.NotNull(navigation, nameof(navigation)); var modelBuilder = relationshipBuilder.ModelBuilder; if (!IsNonNullable(modelBuilder, navigation) || navigation.IsCollection()) { return; } if (!navigation.IsDependentToPrincipal()) { var inverse = navigation.FindInverse(); if (inverse != null) { if (IsNonNullable(modelBuilder, inverse)) { Dependencies.Logger.NonNullableReferenceOnBothNavigations(navigation, inverse); return; } } if (!navigation.ForeignKey.IsUnique || relationshipBuilder.Metadata.GetPrincipalEndConfigurationSource() != null) { Dependencies.Logger.NonNullableReferenceOnDependent(navigation.ForeignKey.PrincipalToDependent); return; } var newRelationshipBuilder = relationshipBuilder.HasEntityTypes( relationshipBuilder.Metadata.DeclaringEntityType, relationshipBuilder.Metadata.PrincipalEntityType); if (newRelationshipBuilder == null) { return; } Dependencies.Logger.NonNullableInverted(newRelationshipBuilder.Metadata.DependentToPrincipal); relationshipBuilder = newRelationshipBuilder; } relationshipBuilder.IsRequired(true); context.StopProcessingIfChanged(relationshipBuilder.Metadata.DependentToPrincipal); }
/// <summary> /// Called after a navigation property that has an attribute is added to an entity type. /// </summary> /// <param name="relationshipBuilder"> The builder for the relationship. </param> /// <param name="navigation"> The navigation. </param> /// <param name="attribute"> The attribute. </param> /// <param name="context"> Additional information associated with convention execution. </param> public override void ProcessNavigationAdded( IConventionRelationshipBuilder relationshipBuilder, IConventionNavigation navigation, RequiredAttribute attribute, IConventionContext <IConventionNavigation> context) { Check.NotNull(relationshipBuilder, nameof(relationshipBuilder)); Check.NotNull(navigation, nameof(navigation)); Check.NotNull(attribute, nameof(attribute)); if (navigation.IsCollection()) { Dependencies.Logger.RequiredAttributeOnCollection(navigation.ForeignKey.DependentToPrincipal); return; } if (!navigation.IsDependentToPrincipal()) { var inverse = navigation.FindInverse(); if (inverse != null) { var attributes = GetAttributes <RequiredAttribute>(inverse.DeclaringEntityType, inverse); if (attributes.Any()) { Dependencies.Logger.RequiredAttributeOnBothNavigations(navigation, inverse); return; } } if (relationshipBuilder.Metadata.GetPrincipalEndConfigurationSource() != null) { Dependencies.Logger.RequiredAttributeOnDependent(navigation.ForeignKey.PrincipalToDependent); return; } var newRelationshipBuilder = relationshipBuilder.HasEntityTypes( relationshipBuilder.Metadata.DeclaringEntityType, relationshipBuilder.Metadata.PrincipalEntityType); if (newRelationshipBuilder == null) { return; } Dependencies.Logger.RequiredAttributeInverted(newRelationshipBuilder.Metadata.DependentToPrincipal); relationshipBuilder = newRelationshipBuilder; } relationshipBuilder.IsRequired(true, fromDataAnnotation: true); context.StopProcessingIfChanged(relationshipBuilder.Metadata.DependentToPrincipal); }
/// <summary> /// Returns the configuration source for the navigation. /// </summary> /// <param name="navigation"> The navigation property to find configuration source for. </param> /// <returns> The configuration source for the navigation. </returns> public static ConfigurationSource?GetConfigurationSource([NotNull] this IConventionNavigation navigation) => navigation.IsDependentToPrincipal() ? navigation.ForeignKey.GetDependentToPrincipalConfigurationSource() : navigation.ForeignKey.GetPrincipalToDependentConfigurationSource();
/// <summary> /// Called after a navigation is added to the entity type. /// </summary> /// <param name="relationshipBuilder"> The builder for the foreign key. </param> /// <param name="navigation"> The navigation. </param> /// <param name="context"> Additional information associated with convention execution. </param> public virtual void ProcessNavigationAdded( IConventionRelationshipBuilder relationshipBuilder, IConventionNavigation navigation, IConventionContext <IConventionNavigation> context) { var newRelationshipBuilder = DiscoverProperties(relationshipBuilder, context); context.StopProcessingIfChanged(newRelationshipBuilder?.Metadata.GetNavigation(navigation.IsDependentToPrincipal())); }