public override IConventionForeignKey?OnSkipNavigationForeignKeyChanged(
            IConventionSkipNavigationBuilder navigationBuilder,
            IConventionForeignKey?foreignKey,
            IConventionForeignKey?oldForeignKey)
        {
            if (!navigationBuilder.Metadata.DeclaringEntityType.IsInModel)
            {
                return(null);
            }

            using (_dispatcher.DelayConventions())
            {
                _foreignKeyConventionContext.ResetState(foreignKey);
                foreach (var skipNavigationConvention in _conventionSet.SkipNavigationForeignKeyChangedConventions)
                {
                    skipNavigationConvention.ProcessSkipNavigationForeignKeyChanged(
                        navigationBuilder, foreignKey, oldForeignKey, _foreignKeyConventionContext);
                    if (_foreignKeyConventionContext.ShouldStopProcessing())
                    {
                        if (_foreignKeyConventionContext.Result != null)
                        {
                            // Preserve the old configuration to let the conventions finish processing them
                            _dispatcher.OnSkipNavigationForeignKeyChanged(navigationBuilder, foreignKey, oldForeignKey);
                        }

                        return(_foreignKeyConventionContext.Result);
                    }
                }
            }

            return(!navigationBuilder.Metadata.IsInModel ? null : foreignKey);
        }
 public override IConventionForeignKey?OnSkipNavigationForeignKeyChanged(
     IConventionSkipNavigationBuilder navigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey)
 {
     Add(new OnSkipNavigationForeignKeyChangedNode(navigationBuilder, foreignKey, oldForeignKey));
     return(foreignKey);
 }
 public OnSkipNavigationForeignKeyChangedNode(
     IConventionSkipNavigationBuilder navigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey)
 {
     NavigationBuilder = navigationBuilder;
     ForeignKey        = foreignKey;
     OldForeignKey     = oldForeignKey;
 }
Ejemplo n.º 4
0
 /// <inheritdoc />
 public virtual void ProcessSkipNavigationForeignKeyChanged(
     IConventionSkipNavigationBuilder skipNavigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey,
     IConventionContext <IConventionForeignKey> context)
 {
     if (foreignKey is not null && foreignKey.IsInModel)
     {
         foreignKey.Builder.OnDelete(GetTargetDeleteBehavior(foreignKey));
     }
 }
Ejemplo n.º 5
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 T Track <T>(Func <T> func, [DisallowNull] ref IConventionForeignKey?foreignKey)
        {
            var batch = DelayConventions();

            using var foreignKeyReference = Tracker.Track(foreignKey);
            var result = func();

            batch.Dispose();
            foreignKey = foreignKeyReference.Object is null || !foreignKeyReference.Object.IsInModel
                ? null
                : foreignKeyReference.Object;
            return(result);
        }
Ejemplo n.º 6
0
 public virtual void ProcessSkipNavigationForeignKeyChanged(
     IConventionSkipNavigationBuilder skipNavigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey,
     IConventionContext <IConventionForeignKey> context)
 {
     if (foreignKey?.IsInModel == true &&
         foreignKey.GetPropertiesConfigurationSource() == null &&
         skipNavigationBuilder.Metadata.Inverse?.IsInModel == true)
     {
         DiscoverProperties(foreignKey.Builder, context);
     }
 }
Ejemplo n.º 7
0
    /// <inheritdoc />
    public override void ProcessSkipNavigationForeignKeyChanged(
        IConventionSkipNavigationBuilder skipNavigationBuilder,
        IConventionForeignKey?foreignKey,
        IConventionForeignKey?oldForeignKey,
        IConventionContext <IConventionForeignKey> context)
    {
        base.ProcessSkipNavigationForeignKeyChanged(skipNavigationBuilder, foreignKey, oldForeignKey, context);

        if (oldForeignKey != null)
        {
            ProcessJoinPartitionKey(skipNavigationBuilder.Metadata);
        }
    }
Ejemplo n.º 8
0
        public virtual void ProcessSkipNavigationForeignKeyChanged(
            IConventionSkipNavigationBuilder skipNavigationBuilder,
            IConventionForeignKey?foreignKey,
            IConventionForeignKey?oldForeignKey,
            IConventionContext <IConventionForeignKey> context)
        {
            var joinEntityTypeBuilder = skipNavigationBuilder.Metadata.ForeignKey?.DeclaringEntityType.Builder;

            if (joinEntityTypeBuilder != null &&
                skipNavigationBuilder.Metadata.IsCollection)
            {
                TryConfigurePrimaryKey(joinEntityTypeBuilder);
            }
        }
Ejemplo n.º 9
0
 /// <inheritdoc />
 public virtual void ProcessSkipNavigationForeignKeyChanged(
     IConventionSkipNavigationBuilder skipNavigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey,
     IConventionContext <IConventionForeignKey> context)
 {
     if (foreignKey != null &&
         foreignKey.IsInModel)
     {
         var fkPropertiesToSet = FindCandidateDependentPropertiesThroughNavigation(skipNavigationBuilder.Metadata);
         if (fkPropertiesToSet != null)
         {
             foreignKey.Builder.HasForeignKey(fkPropertiesToSet, fromDataAnnotation: true);
         }
     }
 }
        /// <inheritdoc />
        public virtual void ProcessSkipNavigationForeignKeyChanged(
            IConventionSkipNavigationBuilder skipNavigationBuilder,
            IConventionForeignKey?foreignKey,
            IConventionForeignKey?oldForeignKey,
            IConventionContext <IConventionForeignKey> context)
        {
            var joinEntityType = oldForeignKey?.DeclaringEntityType;
            var navigation     = skipNavigationBuilder.Metadata;

            if (joinEntityType is not null &&
                joinEntityType.IsInModel &&
                navigation.IsCollection &&
                navigation.ForeignKey?.DeclaringEntityType != joinEntityType)
            {
                ((InternalModelBuilder)joinEntityType.Model.Builder).RemoveImplicitJoinEntity((EntityType)joinEntityType);
            }
        }
Ejemplo n.º 11
0
 /// <inheritdoc />
 public virtual void ProcessSkipNavigationForeignKeyChanged(
     IConventionSkipNavigationBuilder skipNavigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey,
     IConventionContext <IConventionForeignKey> context)
 {
     if (skipNavigationBuilder.Metadata.JoinEntityType is IConventionEntityType joinEntityType &&
         joinEntityType.HasSharedClrType &&
         !joinEntityType.IsTemporal() &&
         joinEntityType.GetConfigurationSource() == ConfigurationSource.Convention &&
         skipNavigationBuilder.Metadata.DeclaringEntityType.IsTemporal() &&
         skipNavigationBuilder.Metadata.Inverse is IConventionSkipNavigation inverse &&
         inverse.DeclaringEntityType.IsTemporal())
     {
         joinEntityType.SetIsTemporal(true);
     }
 }
Ejemplo n.º 12
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 IConventionForeignKey?OnSkipNavigationForeignKeyChanged(
     IConventionSkipNavigationBuilder navigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey)
 => _scope.OnSkipNavigationForeignKeyChanged(navigationBuilder, foreignKey, oldForeignKey);
 public abstract IConventionForeignKey?OnSkipNavigationForeignKeyChanged(
     IConventionSkipNavigationBuilder navigationBuilder,
     IConventionForeignKey?foreignKey,
     IConventionForeignKey?oldForeignKey);
Ejemplo n.º 14
0
 public virtual IConventionForeignKey?OnSkipNavigationForeignKeyChanged(
     [NotNull] IConventionSkipNavigationBuilder navigationBuilder,
     [CanBeNull] IConventionForeignKey?foreignKey,
     [CanBeNull] IConventionForeignKey?oldForeignKey)
 => _scope.OnSkipNavigationForeignKeyChanged(navigationBuilder, foreignKey, oldForeignKey);
 public abstract IConventionForeignKey?OnSkipNavigationForeignKeyChanged(
     [NotNull] IConventionSkipNavigationBuilder navigationBuilder,
     [CanBeNull] IConventionForeignKey?foreignKey,
     [CanBeNull] IConventionForeignKey?oldForeignKey);