public override void ProcessNavigationAdded(
     IConventionNavigationBuilder navigationBuilder,
     BackingFieldAttribute attribute,
     IConventionContext <IConventionNavigationBuilder> context)
 {
     navigationBuilder.HasField(attribute.Name, fromDataAnnotation: true);
 }
 /// <inheritdoc />
 public virtual void ProcessNavigationAdded(
     IConventionNavigationBuilder navigationBuilder,
     IConventionContext <IConventionNavigationBuilder> context)
 {
     ProcessNavigation(navigationBuilder);
     context.StopProcessingIfChanged(navigationBuilder.Metadata.Builder);
 }
Esempio n. 3
0
        public override IConventionNavigationBuilder?OnNavigationAdded(IConventionNavigationBuilder navigationBuilder)
        {
            if (!navigationBuilder.Metadata.IsInModel)
            {
                return(null);
            }

            using (_dispatcher.DelayConventions())
            {
                _navigationConventionBuilderContext.ResetState(navigationBuilder);
                foreach (var navigationConvention in _conventionSet.NavigationAddedConventions)
                {
                    navigationConvention.ProcessNavigationAdded(navigationBuilder, _navigationConventionBuilderContext);
                    if (_navigationConventionBuilderContext.ShouldStopProcessing())
                    {
                        return(_navigationConventionBuilderContext.Result);
                    }
                }
            }

            if (!navigationBuilder.Metadata.IsInModel)
            {
                return(null);
            }

            return(navigationBuilder);
        }
Esempio n. 4
0
        /// <inheritdoc />
        public override void ProcessNavigationAdded(
            IConventionNavigationBuilder navigationBuilder,
            InversePropertyAttribute attribute,
            IConventionContext <IConventionNavigationBuilder> context)
        {
            var navigation = navigationBuilder.Metadata;
            var foreignKey = navigation.ForeignKey;

            if (foreignKey.DeclaringEntityType.IsOwned() ||
                foreignKey.PrincipalEntityType.IsOwned())
            {
                return;
            }

            var newRelationshipBuilder = ConfigureInverseNavigation(
                navigation.DeclaringEntityType.Builder,
                navigation.GetIdentifyingMemberInfo() !,
                navigation.TargetEntityType.Builder,
                attribute);

            if (newRelationshipBuilder == null)
            {
                context.StopProcessing();
                return;
            }

            var newNavigation = navigation.IsOnDependent
                ? newRelationshipBuilder.Metadata.DependentToPrincipal
                : newRelationshipBuilder.Metadata.PrincipalToDependent;

            context.StopProcessingIfChanged(newNavigation?.Builder);
        }
Esempio n. 5
0
 /// <inheritdoc />
 public override void ProcessNavigationAdded(
     IConventionNavigationBuilder navigationBuilder,
     RequiredAttribute attribute,
     IConventionContext <IConventionNavigationBuilder> context)
 {
     ProcessNavigation(navigationBuilder);
     context.StopProcessingIfChanged(navigationBuilder.Metadata.Builder);
 }
        /// <inheritdoc />
        public virtual void ProcessNavigationAdded(
            IConventionNavigationBuilder navigationBuilder,
            IConventionContext <IConventionNavigationBuilder> context)
        {
            var navigation             = navigationBuilder.Metadata;
            var newRelationshipBuilder = DiscoverProperties(navigation.ForeignKey.Builder, context);

            context.StopProcessingIfChanged(newRelationshipBuilder?.Metadata.GetNavigation(navigation.IsOnDependent)?.Builder);
        }
Esempio n. 7
0
        /// <inheritdoc/>
        public override void ProcessNavigationAdded(
            IConventionNavigationBuilder navigationBuilder,
            RequiredAttribute attribute,
            IConventionContext <IConventionNavigationBuilder> context)
        {
            var navigation = navigationBuilder.Metadata;
            var foreignKey = navigation.ForeignKey;

            if (navigation.IsCollection)
            {
                Dependencies.Logger.RequiredAttributeOnCollection(navigation);
                return;
            }

            var relationshipBuilder = foreignKey.Builder;

            if (!navigation.IsOnDependent)
            {
                var inverse = navigation.Inverse;
                if (inverse != null)
                {
                    var attributes = GetAttributes <RequiredAttribute>(inverse.DeclaringEntityType, inverse);
                    if (attributes.Any())
                    {
                        Dependencies.Logger.RequiredAttributeOnBothNavigations(navigation, inverse);
                        return;
                    }
                }

                if (foreignKey.GetPrincipalEndConfigurationSource() != null)
                {
                    Dependencies.Logger.RequiredAttributeOnDependent(foreignKey.PrincipalToDependent);
                    return;
                }

                relationshipBuilder = relationshipBuilder.HasEntityTypes(
                    foreignKey.DeclaringEntityType,
                    foreignKey.PrincipalEntityType);

                if (relationshipBuilder == null)
                {
                    return;
                }

                Dependencies.Logger.RequiredAttributeInverted(relationshipBuilder.Metadata.DependentToPrincipal);
            }

            relationshipBuilder = relationshipBuilder.IsRequired(true, fromDataAnnotation: true);
            if (relationshipBuilder == null)
            {
                return;
            }

            context.StopProcessingIfChanged(relationshipBuilder.Metadata.DependentToPrincipal?.Builder);
        }
Esempio n. 8
0
        /// <inheritdoc />
        public virtual void ProcessNavigationAdded(
            IConventionNavigationBuilder navigationBuilder,
            IConventionContext <IConventionNavigationBuilder> context)
        {
            var navigation          = navigationBuilder.Metadata;
            var foreignKey          = navigation.ForeignKey;
            var relationshipBuilder = foreignKey.Builder;
            var modelBuilder        = navigationBuilder.ModelBuilder;

            if (!IsNonNullable(modelBuilder, navigation) ||
                navigation.IsCollection)
            {
                return;
            }

            if (!navigation.IsOnDependent)
            {
                var inverse = navigation.Inverse;
                if (inverse != null)
                {
                    if (IsNonNullable(modelBuilder, inverse))
                    {
                        Dependencies.Logger.NonNullableReferenceOnBothNavigations(navigation, inverse);
                        return;
                    }
                }

                if (!navigation.ForeignKey.IsUnique ||
                    foreignKey.GetPrincipalEndConfigurationSource() != null)
                {
                    Dependencies.Logger.NonNullableReferenceOnDependent(navigation.ForeignKey.PrincipalToDependent);
                    return;
                }

                relationshipBuilder = relationshipBuilder.HasEntityTypes(
                    foreignKey.DeclaringEntityType,
                    foreignKey.PrincipalEntityType);

                if (relationshipBuilder == null)
                {
                    return;
                }

                Dependencies.Logger.NonNullableInverted(relationshipBuilder.Metadata.DependentToPrincipal);
            }

            relationshipBuilder = relationshipBuilder.IsRequired(true);

            if (relationshipBuilder != null)
            {
                context.StopProcessingIfChanged(relationshipBuilder.Metadata.DependentToPrincipal?.Builder);
            }
        }
Esempio n. 9
0
        /// <inheritdoc/>
        public virtual void ProcessNavigationAdded(
            IConventionNavigationBuilder navigationBuilder,
            IConventionContext <IConventionNavigationBuilder> context)
        {
            var navigation = navigationBuilder.Metadata;
            var field      = GetFieldToSet(navigation);

            if (field != null)
            {
                navigation.Builder.HasField(field);
            }
        }
 /// <inheritdoc />
 public virtual void ProcessNavigationAdded(
     IConventionNavigationBuilder navigationBuilder,
     IConventionContext<IConventionNavigationBuilder> context)
 {
     var navigation = navigationBuilder.Metadata;
     var attributes = GetAttributes<TAttribute>(navigation.DeclaringEntityType, navigation);
     foreach (var attribute in attributes)
     {
         ProcessNavigationAdded(navigationBuilder, attribute, context);
         if (((IReadableConventionContext)context).ShouldStopProcessing())
         {
             break;
         }
     }
 }
Esempio n. 11
0
    /// <summary>
    ///     Called after a navigation is added to the entity type.
    /// </summary>
    /// <param name="navigationBuilder">The builder for the navigation.</param>
    /// <param name="context">Additional information associated with convention execution.</param>
    public virtual void ProcessNavigationAdded(
        IConventionNavigationBuilder navigationBuilder,
        IConventionContext <IConventionNavigationBuilder> context)
    {
        Check.NotNull(navigationBuilder, nameof(navigationBuilder));

        var onDependent            = navigationBuilder.Metadata.IsOnDependent;
        var newRelationshipBuilder = UpdateRelationshipBuilder(navigationBuilder.Metadata.ForeignKey.Builder, context);

        if (newRelationshipBuilder != null)
        {
            var newNavigationBuilder = onDependent
                ? newRelationshipBuilder.Metadata.DependentToPrincipal !.Builder
                : newRelationshipBuilder.Metadata.PrincipalToDependent !.Builder;
            context.StopProcessingIfChanged(newNavigationBuilder);
        }
    }
Esempio n. 12
0
    private void ProcessNavigation(IConventionNavigationBuilder navigationBuilder)
    {
        var navigation = navigationBuilder.Metadata;
        var foreignKey = navigation.ForeignKey;

        if (navigation.IsCollection)
        {
            Dependencies.Logger.RequiredAttributeOnCollection(navigation);
            return;
        }

        if (navigation.IsOnDependent)
        {
            foreignKey.Builder.IsRequired(true, fromDataAnnotation: true);
        }
        else
        {
            foreignKey.Builder.IsRequiredDependent(true, fromDataAnnotation: true);
        }
    }
        private void ProcessNavigation(IConventionNavigationBuilder navigationBuilder)
        {
            var navigation   = navigationBuilder.Metadata;
            var foreignKey   = navigation.ForeignKey;
            var modelBuilder = navigationBuilder.ModelBuilder;

            if (!IsNonNullable(modelBuilder, navigation) ||
                navigation.IsCollection)
            {
                return;
            }

            if (navigation.IsOnDependent)
            {
                foreignKey.Builder.IsRequired(true);
            }
            else
            {
                foreignKey.Builder.IsRequiredDependent(true);
            }
        }
Esempio n. 14
0
        private void ProcessNavigation(IConventionNavigationBuilder navigationBuilder)
        {
            var navigation = navigationBuilder.Metadata;
            var foreignKey = navigation.ForeignKey;

            if (navigation.IsCollection)
            {
                Dependencies.Logger.RequiredAttributeOnCollection(navigation);
                return;
            }

            var relationshipBuilder = foreignKey.Builder;

            if (!navigation.IsOnDependent)
            {
                var inverse = navigation.Inverse;
                if (inverse != null)
                {
                    var attributes = GetAttributes <RequiredAttribute>(inverse.DeclaringEntityType, inverse);
                    if (attributes.Any())
                    {
                        Dependencies.Logger.RequiredAttributeOnBothNavigations(navigation, inverse);
                        return;
                    }
                }

                if (foreignKey.GetPrincipalEndConfigurationSource() != null)
                {
                    Dependencies.Logger.RequiredAttributeOnDependent(foreignKey.PrincipalToDependent);
                    return;
                }

                return;
            }

            relationshipBuilder.IsRequired(true, fromDataAnnotation: true);
        }
        private void ProcessNavigation(IConventionNavigationBuilder navigationBuilder)
        {
            var navigation          = navigationBuilder.Metadata;
            var foreignKey          = navigation.ForeignKey;
            var relationshipBuilder = foreignKey.Builder;
            var modelBuilder        = navigationBuilder.ModelBuilder;

            if (!IsNonNullable(modelBuilder, navigation) ||
                navigation.IsCollection)
            {
                return;
            }

            if (!navigation.IsOnDependent)
            {
                var inverse = navigation.Inverse;
                if (inverse != null)
                {
                    if (IsNonNullable(modelBuilder, inverse))
                    {
                        Dependencies.Logger.NonNullableReferenceOnBothNavigations(navigation, inverse);
                        return;
                    }
                }

                if (foreignKey.GetPrincipalEndConfigurationSource() != null)
                {
                    Dependencies.Logger.NonNullableReferenceOnDependent(navigation.ForeignKey.PrincipalToDependent);
                    return;
                }

                return;
            }

            relationshipBuilder.IsRequired(true);
        }
 public abstract IConventionNavigationBuilder?OnNavigationAdded(IConventionNavigationBuilder navigationBuilder);
 public abstract IConventionNavigationBuilder OnNavigationAdded([NotNull] IConventionNavigationBuilder navigationBuilder);
Esempio n. 18
0
 /// <inheritdoc />
 public virtual void ProcessNavigationAdded(
     IConventionNavigationBuilder navigationBuilder,
     IConventionContext <IConventionNavigationBuilder> context)
 {
     DiscoverField(navigationBuilder);
 }
 public OnNavigationAddedNode(IConventionNavigationBuilder navigationBuilder)
 {
     NavigationBuilder = navigationBuilder;
 }
 public override IConventionNavigationBuilder OnNavigationAdded(IConventionNavigationBuilder navigationBuilder)
 {
     Add(new OnNavigationAddedNode(navigationBuilder));
     return(navigationBuilder);
 }
Esempio n. 21
0
 /// <summary>
 ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
 ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
 ///     any release. You should only use it directly in your code with extreme caution and knowing that
 ///     doing so can result in application failures when updating to a new Entity Framework Core release.
 /// </summary>
 public virtual IConventionNavigationBuilder OnNavigationAdded([NotNull] IConventionNavigationBuilder navigationBuilder)
 => _scope.OnNavigationAdded(navigationBuilder);
Esempio n. 22
0
 /// <summary>
 ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
 ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
 ///     any release. You should only use it directly in your code with extreme caution and knowing that
 ///     doing so can result in application failures when updating to a new Entity Framework Core release.
 /// </summary>
 public virtual IConventionNavigationBuilder?OnNavigationAdded(IConventionNavigationBuilder navigationBuilder)
 => _scope.OnNavigationAdded(navigationBuilder);
Esempio n. 23
0
    public void ProcessNavigationAdded(IConventionNavigationBuilder navigationBuilder, IConventionContext <IConventionNavigationBuilder> context)
    {
        var navigation = navigationBuilder.Metadata;

        ProcessNavigation(navigation);
    }
 /// <summary>
 ///     Called after a navigation property that has an attribute is added to an entity type.
 /// </summary>
 /// <param name="navigationBuilder"> The builder for the navigation. </param>
 /// <param name="attribute"> The attribute. </param>
 /// <param name="context"> Additional information associated with convention execution. </param>
 public virtual void ProcessNavigationAdded(
     [NotNull] IConventionNavigationBuilder navigationBuilder,
     [NotNull] TAttribute attribute,
     [NotNull] IConventionContext <IConventionNavigationBuilder> context)
 => throw new NotImplementedException();