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); }
public override IConventionSkipNavigation OnSkipNavigationInverseChanged( IConventionSkipNavigationBuilder navigationBuilder, IConventionSkipNavigation inverse, IConventionSkipNavigation oldInverse) { Add(new OnSkipNavigationInverseChangedNode(navigationBuilder, inverse, oldInverse)); return(inverse); }
public OnSkipNavigationInverseChangedNode( IConventionSkipNavigationBuilder navigationBuilder, IConventionSkipNavigation inverse, IConventionSkipNavigation oldInverse) { NavigationBuilder = navigationBuilder; Inverse = inverse; OldInverse = oldInverse; }
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); }
/// <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); }
/// <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); }
/// <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); } }
/// <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); } }
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()); }
/// <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); }
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); }
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()); }
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()); }
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); }
/// <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);
/// <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);
/// <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);
public abstract IConventionSkipNavigation OnSkipNavigationInverseChanged( [NotNull] IConventionSkipNavigationBuilder navigationBuilder, [NotNull] IConventionSkipNavigation inverse, [NotNull] IConventionSkipNavigation oldInverse);
public abstract IConventionSkipNavigation OnSkipNavigationRemoved( [NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [NotNull] IConventionSkipNavigation navigation);
private static bool ShouldSharePartitionKey(IConventionSkipNavigation skipNavigation) => skipNavigation.DeclaringEntityType.GetContainer() == skipNavigation.TargetEntityType.GetContainer() && skipNavigation.DeclaringEntityType.GetPartitionKeyPropertyName() != null && skipNavigation.Inverse?.DeclaringEntityType.GetPartitionKeyPropertyName() == skipNavigation.DeclaringEntityType.GetPartitionKeyPropertyName();