Exemple #1
0
 public override IConventionSkipNavigation OnSkipNavigationRemoved(
     IConventionEntityTypeBuilder entityTypeBuilder,
     IConventionSkipNavigation navigation)
 {
     Add(new OnSkipNavigationRemovedNode(entityTypeBuilder, navigation));
     return(navigation);
 }
        /// <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 bool CanSetAutoInclude(bool?autoInclude, ConfigurationSource configurationSource)
        {
            IConventionSkipNavigation conventionNavigation = Metadata;

            return(configurationSource.Overrides(conventionNavigation.GetIsEagerLoadedConfigurationSource()) ||
                   conventionNavigation.IsEagerLoaded == autoInclude);
        }
 /// <inheritdoc />
 public virtual void ProcessSkipNavigationInverseChanged(
     IConventionSkipNavigationBuilder skipNavigationBuilder,
     IConventionSkipNavigation inverse,
     IConventionSkipNavigation oldInverse,
     IConventionContext <IConventionSkipNavigation> context)
 {
     CreateJoinEntityType(skipNavigationBuilder);
 }
Exemple #4
0
 public override IConventionSkipNavigation OnSkipNavigationInverseChanged(
     IConventionSkipNavigationBuilder navigationBuilder,
     IConventionSkipNavigation inverse,
     IConventionSkipNavigation oldInverse)
 {
     Add(new OnSkipNavigationInverseChangedNode(navigationBuilder, inverse, oldInverse));
     return(inverse);
 }
Exemple #5
0
 public OnSkipNavigationInverseChangedNode(
     IConventionSkipNavigationBuilder navigationBuilder,
     IConventionSkipNavigation inverse,
     IConventionSkipNavigation oldInverse)
 {
     NavigationBuilder = navigationBuilder;
     Inverse           = inverse;
     OldInverse        = oldInverse;
 }
Exemple #6
0
        private void ConfigurePartitionKeyJoinEntityType(IConventionSkipNavigation skipNavigation, IConventionEntityTypeBuilder joinEntityTypeBuilder)
        {
            var principalPartitionKey = skipNavigation.DeclaringEntityType.GetPartitionKeyProperty() !;
            var partitionKey          = joinEntityTypeBuilder.Property(principalPartitionKey.ClrType, principalPartitionKey.Name) !.Metadata;

            joinEntityTypeBuilder.HasPartitionKey(partitionKey.Name);

            CreateSkipNavigationForeignKey(skipNavigation, joinEntityTypeBuilder, partitionKey);
            CreateSkipNavigationForeignKey(skipNavigation.Inverse !, joinEntityTypeBuilder, partitionKey);
        }
Exemple #7
0
        /// <summary>
        ///     Checks whether a new join antity type is needed.
        /// </summary>
        /// <param name="skipNavigation">The target skip navigation.</param>
        /// <returns>A value indicating whether a new join antity type is needed.</returns>
        protected virtual bool ShouldCreateJoinType(IConventionSkipNavigation skipNavigation)
        {
            var inverseSkipNavigation = skipNavigation.Inverse;

            return(skipNavigation.ForeignKey == null &&
                   skipNavigation.IsCollection &&
                   inverseSkipNavigation != null &&
                   inverseSkipNavigation.ForeignKey == null &&
                   inverseSkipNavigation.IsCollection);
        }
Exemple #8
0
        /// <inheritdoc />
        public virtual void ProcessSkipNavigationInverseChanged(
            IConventionSkipNavigationBuilder skipNavigationBuilder,
            IConventionSkipNavigation inverse,
            IConventionSkipNavigation oldInverse,
            IConventionContext <IConventionSkipNavigation> context)
        {
            Check.NotNull(skipNavigationBuilder, nameof(skipNavigationBuilder));
            Check.NotNull(context, nameof(context));

            CreateAssociationEntityType(skipNavigationBuilder);
        }
Exemple #9
0
 /// <inheritdoc />
 protected override void CreateJoinEntityType(string joinEntityTypeName, IConventionSkipNavigation skipNavigation)
 {
     if (ShouldSharePartitionKey(skipNavigation))
     {
         var model = skipNavigation.DeclaringEntityType.Model;
         var joinEntityTypeBuilder = model.Builder.SharedTypeEntity(joinEntityTypeName, typeof(Dictionary <string, object>)) !;
         ConfigurePartitionKeyJoinEntityType(skipNavigation, joinEntityTypeBuilder);
     }
     else
     {
         base.CreateJoinEntityType(joinEntityTypeName, skipNavigation);
     }
 }
        /// <inheritdoc />
        public virtual void ProcessSkipNavigationRemoved(
            IConventionEntityTypeBuilder entityTypeBuilder,
            IConventionSkipNavigation navigation,
            IConventionContext <IConventionSkipNavigation> context)
        {
            var joinEntityType = navigation.ForeignKey?.DeclaringEntityType;

            if (joinEntityType?.Builder != null &&
                navigation.IsCollection)
            {
                ((InternalModelBuilder)joinEntityType.Model.Builder).RemoveImplicitJoinEntity((EntityType)joinEntityType);
            }
        }
Exemple #11
0
        /// <summary>
        ///     Create a join entity type and configures the corresponding foreign keys.
        /// </summary>
        /// <param name="joinEntityTypeName">The name for the new entity type.</param>
        /// <param name="skipNavigation">The target skip navigation.</param>
        protected virtual void CreateJoinEntityType(
            string joinEntityTypeName,
            IConventionSkipNavigation skipNavigation)
        {
            var model = skipNavigation.DeclaringEntityType.Model;

            var joinEntityTypeBuilder = model.Builder.SharedTypeEntity(joinEntityTypeName, Model.DefaultPropertyBagType) !;

            var inverseSkipNavigation = skipNavigation.Inverse !;

            CreateSkipNavigationForeignKey(skipNavigation, joinEntityTypeBuilder);
            CreateSkipNavigationForeignKey(inverseSkipNavigation, joinEntityTypeBuilder);
        }
        /// <inheritdoc />
        public virtual void ProcessSkipNavigationInverseChanged(
            IConventionSkipNavigationBuilder skipNavigationBuilder,
            IConventionSkipNavigation inverse,
            IConventionSkipNavigation oldInverse,
            IConventionContext <IConventionSkipNavigation> context)
        {
            var foreignKey = skipNavigationBuilder.Metadata.ForeignKey;

            if (foreignKey != null &&
                foreignKey.GetPropertiesConfigurationSource() == null &&
                inverse?.Builder != null)
            {
                DiscoverProperties(foreignKey.Builder, context);
            }
        }
Exemple #13
0
        private IConventionForeignKey CreateSkipNavigationForeignKey(
            IConventionSkipNavigation skipNavigation,
            IConventionEntityTypeBuilder joinEntityTypeBuilder,
            IConventionProperty partitionKeyProperty)
        {
            if (skipNavigation.ForeignKey != null &&
                !skipNavigation.Builder.CanSetForeignKey(null))
            {
                return(skipNavigation.ForeignKey);
            }

            var principalKey = skipNavigation.DeclaringEntityType.FindPrimaryKey();

            if (principalKey == null ||
                principalKey.Properties.All(p => p.Name != partitionKeyProperty.Name))
            {
                return(CreateSkipNavigationForeignKey(skipNavigation, joinEntityTypeBuilder));
            }

            if (skipNavigation.ForeignKey?.Properties.Contains(partitionKeyProperty) == true)
            {
                return(skipNavigation.ForeignKey);
            }

            var dependentProperties = new IConventionProperty[principalKey.Properties.Count];

            for (var i = 0; i < principalKey.Properties.Count; i++)
            {
                var principalProperty = principalKey.Properties[i];
                if (principalProperty.Name == partitionKeyProperty.Name)
                {
                    dependentProperties[i] = partitionKeyProperty;
                }
                else
                {
                    dependentProperties[i] = joinEntityTypeBuilder.CreateUniqueProperty(
                        principalProperty.ClrType, principalProperty.Name, required: true) !.Metadata;
                }
            }

            var foreignKey = joinEntityTypeBuilder.HasRelationship(skipNavigation.DeclaringEntityType, dependentProperties, principalKey) !
                             .IsUnique(false) !
                             .Metadata;

            skipNavigation.Builder.HasForeignKey(foreignKey);

            return(foreignKey);
        }
        public void Can_only_override_lower_or_equal_source_SkipNavigation()
        {
            var builder = CreateInternalSkipNavigationBuilder();
            IConventionSkipNavigation skipNavigation = builder.Metadata;

            ((SkipNavigation)skipNavigation).SetConfigurationSource(ConfigurationSource.DataAnnotation);

            var productEntity = skipNavigation.TargetEntityType.Builder;

            Assert.Null(productEntity.HasRelationship(skipNavigation.DeclaringEntityType, null, nameof(Order.Products)));

            Assert.NotNull(productEntity.HasRelationship(
                               skipNavigation.DeclaringEntityType, null, nameof(Order.Products), fromDataAnnotation: true));

            Assert.False(skipNavigation.IsInModel);
            Assert.Empty(skipNavigation.DeclaringEntityType.GetSkipNavigations());
        }
Exemple #15
0
        /// <summary>
        ///     Creates a foreign key on the given entity type to be used by the given skip navigation.
        /// </summary>
        /// <param name="skipNavigation">The target skip navigation.</param>
        /// <param name="joinEntityTypeBuilder">The join entity type.</param>
        /// <returns>The created foreign key.</returns>
        protected virtual IConventionForeignKey CreateSkipNavigationForeignKey(
            IConventionSkipNavigation skipNavigation,
            IConventionEntityTypeBuilder joinEntityTypeBuilder)
        {
            var foreignKey = ((InternalEntityTypeBuilder)joinEntityTypeBuilder)
                             .HasRelationship(
                (EntityType)skipNavigation.DeclaringEntityType,
                ConfigurationSource.Convention,
                required: true,
                skipNavigation.Inverse !.Name) !
                             .IsUnique(false, ConfigurationSource.Convention) !
                             .Metadata;

            skipNavigation.Builder.HasForeignKey(foreignKey);

            return(foreignKey);
        }
Exemple #16
0
    private void ProcessJoinPartitionKey(IConventionSkipNavigation skipNavigation)
    {
        var inverseSkipNavigation = skipNavigation.Inverse;

        if (skipNavigation.JoinEntityType != null &&
            skipNavigation.IsCollection &&
            inverseSkipNavigation != null &&
            inverseSkipNavigation.IsCollection &&
            inverseSkipNavigation.JoinEntityType == skipNavigation.JoinEntityType)
        {
            var joinEntityType        = skipNavigation.JoinEntityType;
            var joinEntityTypeBuilder = joinEntityType.Builder;
            if (ShouldSharePartitionKey(skipNavigation))
            {
                var principalPartitionKey = skipNavigation.DeclaringEntityType.GetPartitionKeyProperty() !;
                var partitionKey          = joinEntityType.GetPartitionKeyProperty();
                if ((partitionKey != null &&
                     (!joinEntityTypeBuilder.CanSetPartitionKey(principalPartitionKey.Name) ||
                      (skipNavigation.ForeignKey !.Properties.Contains(partitionKey) &&
                       inverseSkipNavigation.ForeignKey !.Properties.Contains(partitionKey)))) ||
                    !skipNavigation.Builder.CanSetForeignKey(null) ||
                    !inverseSkipNavigation.Builder.CanSetForeignKey(null))
                {
                    return;
                }

                ConfigurePartitionKeyJoinEntityType(skipNavigation, joinEntityTypeBuilder);
            }
            else
            {
                var partitionKey = joinEntityType.GetPartitionKeyProperty();
                if (partitionKey != null &&
                    joinEntityTypeBuilder.HasPartitionKey(null) != null &&
                    ((skipNavigation.ForeignKey !.Properties.Contains(partitionKey) &&
                      skipNavigation.Builder.CanSetForeignKey(null)) ||
                     (inverseSkipNavigation.ForeignKey !.Properties.Contains(partitionKey) &&
                      inverseSkipNavigation.Builder.CanSetForeignKey(null))))
                {
                    CreateSkipNavigationForeignKey(skipNavigation, joinEntityTypeBuilder);
                    CreateSkipNavigationForeignKey(inverseSkipNavigation, joinEntityTypeBuilder);
                }
            }
        }
    }
        public void Can_only_override_lower_or_equal_source_Inverse()
        {
            var builder = CreateInternalSkipNavigationBuilder();
            IConventionSkipNavigation metadata = builder.Metadata;

            // the skip navigation is pointing to the automatically-generated
            // join entity type and so is its inverse
            var inverse = (SkipNavigation)metadata.TargetEntityType.Builder.HasSkipNavigation(
                Product.OrdersProperty,
                metadata.DeclaringEntityType)
                          .Metadata;

            Assert.NotNull(metadata.Inverse);
            Assert.Equal(ConfigurationSource.Convention, metadata.GetInverseConfigurationSource());
            Assert.NotNull(inverse.Inverse);
            Assert.Equal(ConfigurationSource.Convention, inverse.GetInverseConfigurationSource());

            // now explicitly assign the skip navigation's Inverse
            Assert.True(builder.CanSetInverse(inverse, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasInverse(inverse, ConfigurationSource.DataAnnotation));

            Assert.Equal(inverse, metadata.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetInverseConfigurationSource());
            Assert.Equal(metadata, inverse.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, inverse.GetInverseConfigurationSource());

            Assert.True(builder.CanSetInverse(inverse, ConfigurationSource.Convention));
            Assert.False(builder.CanSetInverse(null, ConfigurationSource.Convention));
            Assert.NotNull(builder.HasInverse(inverse, ConfigurationSource.Convention));
            Assert.Null(builder.HasInverse(null, ConfigurationSource.Convention));

            Assert.Equal(inverse, metadata.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetInverseConfigurationSource());
            Assert.Equal(metadata, inverse.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, inverse.GetInverseConfigurationSource());

            Assert.True(builder.CanSetInverse(null, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasInverse(null, ConfigurationSource.DataAnnotation));

            Assert.Null(metadata.Inverse);
            Assert.Null(metadata.GetInverseConfigurationSource());
            Assert.Null(inverse.Inverse);
            Assert.Null(inverse.GetInverseConfigurationSource());
        }
        public void Can_only_override_lower_or_equal_source_ForeignKey()
        {
            var builder = CreateInternalSkipNavigationBuilder();
            IConventionSkipNavigation metadata = builder.Metadata;

            // the skip navigation is pointing to the automatically-generated association entity type
            var originalFK = metadata.ForeignKey;

            Assert.NotNull(originalFK);
            Assert.Equal(ConfigurationSource.Convention, metadata.GetForeignKeyConfigurationSource());

            var orderProductEntity = metadata.DeclaringEntityType.Model.Builder.Entity(typeof(OrderProduct));
            var fk = (ForeignKey)orderProductEntity
                     .HasRelationship(metadata.DeclaringEntityType, nameof(OrderProduct.Order))
                     .IsUnique(false)
                     .Metadata;

            // skip navigation is unaffected by the FK created above
            Assert.NotSame(fk, metadata.ForeignKey);
            Assert.Same(originalFK, metadata.ForeignKey);
            Assert.Equal(ConfigurationSource.Convention, metadata.GetForeignKeyConfigurationSource());

            // now explicitly assign the skip navigation's ForeignKey
            Assert.True(builder.CanSetForeignKey(fk, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasForeignKey(fk, ConfigurationSource.DataAnnotation));

            Assert.Equal(fk, metadata.ForeignKey);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetForeignKeyConfigurationSource());

            Assert.True(builder.CanSetForeignKey(fk, ConfigurationSource.Convention));
            Assert.False(builder.CanSetForeignKey(null, ConfigurationSource.Convention));
            Assert.NotNull(builder.HasForeignKey(fk, ConfigurationSource.Convention));
            Assert.Null(builder.HasForeignKey(null, ConfigurationSource.Convention));

            Assert.Equal(fk, metadata.ForeignKey);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetForeignKeyConfigurationSource());

            Assert.True(builder.CanSetForeignKey(null, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasForeignKey(null, ConfigurationSource.DataAnnotation));

            Assert.Null(metadata.ForeignKey);
            Assert.Null(metadata.GetForeignKeyConfigurationSource());
        }
        public void Can_only_override_lower_or_equal_source_ForeignKey()
        {
            var builder = CreateInternalSkipNavigationBuilder();
            IConventionSkipNavigation metadata = builder.Metadata;

            var originalFK = metadata.ForeignKey;

            Assert.NotNull(originalFK);
            Assert.Equal(ConfigurationSource.Convention, metadata.GetForeignKeyConfigurationSource());

            var orderProductEntity = metadata.DeclaringEntityType.Model.Builder.Entity(typeof(OrderProduct));
            var fk = (ForeignKey)orderProductEntity
                     .HasRelationship(metadata.DeclaringEntityType, nameof(OrderProduct.Order))
                     .IsUnique(false)
                     .Metadata;

            Assert.NotSame(fk, metadata.ForeignKey);
            Assert.Same(originalFK, metadata.ForeignKey);
            Assert.Equal(ConfigurationSource.Convention, metadata.GetForeignKeyConfigurationSource());
            Assert.NotNull(metadata.Inverse.ForeignKey);

            Assert.True(builder.CanSetForeignKey(fk, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasForeignKey(fk, ConfigurationSource.DataAnnotation));

            Assert.Equal(fk, metadata.ForeignKey);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetForeignKeyConfigurationSource());
            Assert.Null(metadata.Inverse.ForeignKey);

            Assert.True(builder.CanSetForeignKey(fk, ConfigurationSource.Convention));
            Assert.False(builder.CanSetForeignKey(null, ConfigurationSource.Convention));
            Assert.NotNull(builder.HasForeignKey(fk, ConfigurationSource.Convention));
            Assert.Null(builder.HasForeignKey(null, ConfigurationSource.Convention));

            Assert.Equal(fk, metadata.ForeignKey);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetForeignKeyConfigurationSource());

            Assert.True(builder.CanSetForeignKey(null, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasForeignKey(null, ConfigurationSource.DataAnnotation));

            Assert.Null(metadata.ForeignKey);
            Assert.Null(metadata.GetForeignKeyConfigurationSource());
        }
        private static IReadOnlyList <string>?FindCandidateDependentPropertiesThroughNavigation(
            IConventionSkipNavigation skipNavigation)
        {
            var navigationFkAttribute = GetForeignKeyAttribute(skipNavigation);

            if (navigationFkAttribute == null)
            {
                return(null);
            }

            var properties = navigationFkAttribute.Name.Split(',').Select(p => p.Trim()).ToList();

            if (properties.Any(string.IsNullOrWhiteSpace))
            {
                throw new InvalidOperationException(
                          CoreStrings.InvalidPropertyListOnNavigation(skipNavigation !.Name, skipNavigation.DeclaringEntityType.DisplayName()));
            }

            return(properties);
        }
Exemple #21
0
        public void Can_only_override_lower_or_equal_source_Inverse()
        {
            var builder = CreateInternalSkipNavigationBuilder();
            IConventionSkipNavigation metadata = builder.Metadata;

            var inverse = (SkipNavigation)metadata.TargetEntityType.Builder.HasSkipNavigation(
                Product.OrdersProperty,
                metadata.DeclaringEntityType)
                          .Metadata;

            Assert.Null(metadata.Inverse);
            Assert.Null(metadata.GetInverseConfigurationSource());
            Assert.Null(inverse.Inverse);
            Assert.Null(inverse.GetInverseConfigurationSource());

            Assert.True(builder.CanSetInverse(inverse, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasInverse(inverse, ConfigurationSource.DataAnnotation));

            Assert.Equal(inverse, metadata.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetInverseConfigurationSource());
            Assert.Equal(metadata, inverse.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, inverse.GetInverseConfigurationSource());

            Assert.True(builder.CanSetInverse(inverse, ConfigurationSource.Convention));
            Assert.False(builder.CanSetInverse(null, ConfigurationSource.Convention));
            Assert.NotNull(builder.HasInverse(inverse, ConfigurationSource.Convention));
            Assert.Null(builder.HasInverse(null, ConfigurationSource.Convention));

            Assert.Equal(inverse, metadata.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetInverseConfigurationSource());
            Assert.Equal(metadata, inverse.Inverse);
            Assert.Equal(ConfigurationSource.DataAnnotation, inverse.GetInverseConfigurationSource());

            Assert.True(builder.CanSetInverse(null, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.HasInverse(null, ConfigurationSource.DataAnnotation));

            Assert.Null(metadata.Inverse);
            Assert.Null(metadata.GetInverseConfigurationSource());
            Assert.Null(inverse.Inverse);
            Assert.Null(inverse.GetInverseConfigurationSource());
        }
Exemple #22
0
            public override IConventionSkipNavigation OnSkipNavigationInverseChanged(
                IConventionSkipNavigationBuilder navigationBuilder,
                IConventionSkipNavigation inverse,
                IConventionSkipNavigation oldInverse)
            {
                if (navigationBuilder.Metadata.DeclaringEntityType.Builder == null)
                {
                    return(null);
                }

                using (_dispatcher.DelayConventions())
                {
                    _skipNavigationConventionContext.ResetState(inverse);
                    foreach (var skipNavigationConvention in _conventionSet.SkipNavigationInverseChangedConventions)
                    {
                        if (navigationBuilder.Metadata.Builder == null ||
                            navigationBuilder.Metadata.Inverse != inverse)
                        {
                            Check.DebugAssert(false, "inverse changed");
                            return(null);
                        }

                        skipNavigationConvention.ProcessSkipNavigationInverseChanged(
                            navigationBuilder, inverse, oldInverse, _skipNavigationConventionContext);
                        if (_skipNavigationConventionContext.ShouldStopProcessing())
                        {
                            return(_skipNavigationConventionContext.Result);
                        }
                    }
                }

                if (navigationBuilder.Metadata.Builder == null)
                {
                    return(null);
                }

                return(inverse);
            }
        public void Can_only_override_lower_or_equal_source_PropertyAccessMode()
        {
            var builder = CreateInternalSkipNavigationBuilder();
            IConventionSkipNavigation metadata = builder.Metadata;

            Assert.Equal(PropertyAccessMode.PreferField, metadata.GetPropertyAccessMode());
            Assert.Null(metadata.GetPropertyAccessModeConfigurationSource());

            Assert.True(builder.CanSetPropertyAccessMode(PropertyAccessMode.PreferProperty, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.UsePropertyAccessMode(PropertyAccessMode.PreferProperty, ConfigurationSource.DataAnnotation));

            Assert.Equal(PropertyAccessMode.PreferProperty, metadata.GetPropertyAccessMode());
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetPropertyAccessModeConfigurationSource());

            Assert.True(builder.CanSetPropertyAccessMode(PropertyAccessMode.PreferProperty, ConfigurationSource.Convention));
            Assert.False(
                builder.CanSetPropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction, ConfigurationSource.Convention));
            Assert.NotNull(builder.UsePropertyAccessMode(PropertyAccessMode.PreferProperty, ConfigurationSource.Convention));
            Assert.Null(builder.UsePropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction, ConfigurationSource.Convention));

            Assert.Equal(PropertyAccessMode.PreferProperty, metadata.GetPropertyAccessMode());
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetPropertyAccessModeConfigurationSource());

            Assert.True(
                builder.CanSetPropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction, ConfigurationSource.DataAnnotation));
            Assert.NotNull(
                builder.UsePropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction, ConfigurationSource.DataAnnotation));

            Assert.Equal(PropertyAccessMode.PreferFieldDuringConstruction, metadata.GetPropertyAccessMode());
            Assert.Equal(ConfigurationSource.DataAnnotation, metadata.GetPropertyAccessModeConfigurationSource());

            Assert.True(builder.CanSetPropertyAccessMode(null, ConfigurationSource.DataAnnotation));
            Assert.NotNull(builder.UsePropertyAccessMode(null, ConfigurationSource.DataAnnotation));

            Assert.Equal(PropertyAccessMode.PreferField, metadata.GetPropertyAccessMode());
            Assert.Null(metadata.GetPropertyAccessModeConfigurationSource());
        }
Exemple #24
0
            public override IConventionSkipNavigation OnSkipNavigationRemoved(
                IConventionEntityTypeBuilder entityTypeBuilder,
                IConventionSkipNavigation navigation)
            {
                if (entityTypeBuilder.Metadata.Builder == null)
                {
                    return(null);
                }

                using (_dispatcher.DelayConventions())
                {
                    _skipNavigationConventionContext.ResetState(navigation);
                    foreach (var skipNavigationConvention in _conventionSet.SkipNavigationRemovedConventions)
                    {
                        skipNavigationConvention.ProcessSkipNavigationRemoved(entityTypeBuilder, navigation, _skipNavigationConventionContext);
                        if (_skipNavigationConventionContext.ShouldStopProcessing())
                        {
                            return(_skipNavigationConventionContext.Result);
                        }
                    }
                }

                return(navigation);
            }
Exemple #25
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 IConventionSkipNavigation OnSkipNavigationRemoved(
     [NotNull] IConventionEntityTypeBuilder entityTypeBuilder,
     [NotNull] IConventionSkipNavigation navigation)
 => _scope.OnSkipNavigationRemoved(entityTypeBuilder, navigation);
Exemple #26
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 IConventionSkipNavigation OnSkipNavigationInverseChanged(
     [NotNull] IConventionSkipNavigationBuilder navigationBuilder,
     [NotNull] IConventionSkipNavigation inverse,
     [NotNull] IConventionSkipNavigation oldInverse)
 => _scope.OnSkipNavigationInverseChanged(navigationBuilder, inverse, oldInverse);
Exemple #27
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 IConventionSkipNavigation?OnSkipNavigationRemoved(
     IConventionEntityTypeBuilder entityTypeBuilder,
     IConventionSkipNavigation navigation)
 => _scope.OnSkipNavigationRemoved(entityTypeBuilder, navigation);
Exemple #28
0
 public abstract IConventionSkipNavigation OnSkipNavigationInverseChanged(
     [NotNull] IConventionSkipNavigationBuilder navigationBuilder,
     [NotNull] IConventionSkipNavigation inverse,
     [NotNull] IConventionSkipNavigation oldInverse);
Exemple #29
0
 public abstract IConventionSkipNavigation OnSkipNavigationRemoved(
     [NotNull] IConventionEntityTypeBuilder entityTypeBuilder,
     [NotNull] IConventionSkipNavigation navigation);
Exemple #30
0
 private static bool ShouldSharePartitionKey(IConventionSkipNavigation skipNavigation)
 => skipNavigation.DeclaringEntityType.GetContainer() == skipNavigation.TargetEntityType.GetContainer() &&
 skipNavigation.DeclaringEntityType.GetPartitionKeyPropertyName() != null &&
 skipNavigation.Inverse?.DeclaringEntityType.GetPartitionKeyPropertyName()
 == skipNavigation.DeclaringEntityType.GetPartitionKeyPropertyName();