/// <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> /// Returns the attributes applied to the given navigation. /// </summary> /// <param name="entityType"> The entity type. </param> /// <param name="navigation"> The navigation. </param> /// <typeparam name="TCustomAttribute"> The attribute type to look for. </typeparam> /// <returns> The attributes applied to the given navigation. </returns> protected static IEnumerable <TCustomAttribute> GetAttributes <TCustomAttribute>( [NotNull] IConventionEntityType entityType, [NotNull] IConventionNavigation navigation) where TCustomAttribute : Attribute { var memberInfo = navigation.GetIdentifyingMemberInfo(); if (!entityType.HasClrType() || memberInfo == null) { return(Enumerable.Empty <TCustomAttribute>()); } return(Attribute.IsDefined(memberInfo, typeof(TCustomAttribute), inherit: true) ? memberInfo.GetCustomAttributes <TCustomAttribute>(true) : Enumerable.Empty <TCustomAttribute>()); }
private static InversePropertyAttribute?GetInversePropertyAttribute(IConventionNavigation navigation) => GetAttribute <InversePropertyAttribute>(navigation.GetIdentifyingMemberInfo());
private static ForeignKeyAttribute GetForeignKeyAttribute(IConventionNavigation navigation) => GetAttribute <ForeignKeyAttribute>(navigation.GetIdentifyingMemberInfo());
/// <summary> /// Returns the attributes applied to the given navigation. /// </summary> /// <param name="entityType"> The entity type. </param> /// <param name="navigation"> The navigation. </param> /// <typeparam name="TCustomAttribute"> The attribute type to look for. </typeparam> /// <returns> The attributes applied to the given navigation. </returns> protected static IEnumerable<TCustomAttribute> GetAttributes<TCustomAttribute>( [NotNull] IConventionEntityType entityType, [NotNull] IConventionNavigation navigation) where TCustomAttribute : Attribute => GetAttributes<TCustomAttribute>(entityType, navigation.GetIdentifyingMemberInfo());