From 2edc3052a8b3d7c5029daa620a5b6a4920fd6a05 Mon Sep 17 00:00:00 2001 From: Smit Patel Date: Wed, 22 Jul 2020 17:14:39 -0700 Subject: [PATCH] Henceforth Associations are Joins Part of #20409 --- .../Internal/NavigationFixer.cs | 62 ++++---- .../Builders/CollectionCollectionBuilder.cs | 102 +++++++------- .../Builders/CollectionCollectionBuilder`.cs | 132 +++++++++--------- .../Builders/CollectionNavigationBuilder.cs | 4 +- .../ProviderConventionSetBuilder.cs | 2 +- ...nyToManyAssociationEntityTypeConvention.cs | 62 ++++---- .../Conventions/ModelCleanupConvention.cs | 2 +- .../RelationshipDiscoveryConvention.cs | 16 +-- .../Metadata/IConventionSkipNavigation.cs | 8 +- src/EFCore/Metadata/IMutableSkipNavigation.cs | 8 +- src/EFCore/Metadata/ISkipNavigation.cs | 6 +- src/EFCore/Metadata/Internal/EntityType.cs | 2 +- .../Metadata/Internal/InternalModelBuilder.cs | 16 +-- .../Internal/InternalSkipNavigationBuilder.cs | 24 ++-- .../Metadata/Internal/SkipNavigation.cs | 20 +-- src/EFCore/Properties/CoreStrings.Designer.cs | 16 +-- src/EFCore/Properties/CoreStrings.resx | 6 +- .../Migrations/ModelSnapshotSqlServerTest.cs | 22 +-- .../ManyToManyTrackingTestBase.cs | 6 +- .../Conventions/ConventionDispatcherTest.cs | 4 +- ...ManyAssociationEntityTypeConventionTest.cs | 34 ++--- .../RelationshipDiscoveryConventionTest.cs | 6 +- .../Metadata/Internal/EntityTypeTest.cs | 8 +- .../Internal/InternalModelBuilderTest.cs | 38 ++--- .../InternalSkipNavigationBuilderTest.cs | 4 +- .../Metadata/Internal/SkipNavigationTest.cs | 16 +-- .../ModelBuilding/ManyToManyTestBase.cs | 26 ++-- .../ModelBuilding/ModelBuilderGenericTest.cs | 98 ++++++------- .../ModelBuilderNonGenericTest.cs | 102 +++++++------- .../ModelBuilding/ModelBuilderTestBase.cs | 58 ++++---- 30 files changed, 455 insertions(+), 455 deletions(-) diff --git a/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs b/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs index 7fc50d2348b..a6abeb1e8ee 100644 --- a/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs +++ b/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs @@ -242,7 +242,7 @@ public virtual void NavigationCollectionChanged( if (navigationBase is ISkipNavigation skipNavigation) { - FindAssociationEntry(entry, oldTargetEntry, skipNavigation)?.SetEntityState(EntityState.Deleted); + FindJoinEntry(entry, oldTargetEntry, skipNavigation)?.SetEntityState(EntityState.Deleted); Check.DebugAssert( skipNavigation.Inverse.IsCollection, @@ -288,15 +288,15 @@ public virtual void NavigationCollectionChanged( if (navigationBase is ISkipNavigation skipNavigation) { - var associationEntry = FindOrCreateAssociationEntry( + var joinEntry = FindOrCreateJoinEntry( entry, newTargetEntry, skipNavigation, fromQuery: false, setModified: false); - if (associationEntry.EntityState == EntityState.Detached) + if (joinEntry.EntityState == EntityState.Detached) { try { _inFixup = false; - associationEntry.SetEntityState(EntityState.Added); + joinEntry.SetEntityState(EntityState.Added); } finally { @@ -840,15 +840,15 @@ private void InitialFixup( } else { - var associationEntry = FindOrCreateAssociationEntry( + var joinEntry = FindOrCreateJoinEntry( entry, otherEntry, skipNavigation, fromQuery, setModified); - if (associationEntry.EntityState == EntityState.Detached) + if (joinEntry.EntityState == EntityState.Detached) { try { _inFixup = false; - associationEntry.SetEntityState(EntityState.Added); + joinEntry.SetEntityState(EntityState.Added); } finally { @@ -885,15 +885,15 @@ private void DelayedFixup( var setModified = referencedEntry.EntityState != EntityState.Unchanged; if (navigationBase is ISkipNavigation skipNavigation) { - var associationEntry = FindOrCreateAssociationEntry( + var joinEntry = FindOrCreateJoinEntry( entry, referencedEntry, skipNavigation, fromQuery, setModified); - if (associationEntry.EntityState == EntityState.Detached) + if (joinEntry.EntityState == EntityState.Detached) { try { _inFixup = false; - associationEntry.SetEntityState(EntityState.Added); + joinEntry.SetEntityState(EntityState.Added); } finally { @@ -929,55 +929,55 @@ private void DelayedFixup( } } - private static InternalEntityEntry FindOrCreateAssociationEntry( + private static InternalEntityEntry FindOrCreateJoinEntry( InternalEntityEntry entry, InternalEntityEntry otherEntry, ISkipNavigation skipNavigation, bool fromQuery, bool setModified) { - var associationEntry = FindAssociationEntry(entry, otherEntry, skipNavigation); + var joinEntry = FindJoinEntry(entry, otherEntry, skipNavigation); - if (associationEntry == null) + if (joinEntry == null) { - var associationEntityType = skipNavigation.AssociationEntityType; - var associationEntity = associationEntityType.GetInstanceFactory()( + var joinEntityType = skipNavigation.JoinEntityType; + var joinEntity = joinEntityType.GetInstanceFactory()( new MaterializationContext(ValueBuffer.Empty, entry.StateManager.Context)); - associationEntry = entry.StateManager.GetOrCreateEntry(associationEntity, associationEntityType); + joinEntry = entry.StateManager.GetOrCreateEntry(joinEntity, joinEntityType); - foreach (var property in associationEntityType.GetProperties()) // Remove when #21720 is implemented + foreach (var property in joinEntityType.GetProperties()) // Remove when #21720 is implemented { if (property.IsIndexerProperty()) { - ((PropertyBase)property).Setter.SetClrValue(associationEntity, property.ClrType.GetDefaultValue()); + ((PropertyBase)property).Setter.SetClrValue(joinEntity, property.ClrType.GetDefaultValue()); } } } - SetForeignKeyProperties(associationEntry, entry, skipNavigation.ForeignKey, setModified, fromQuery); - SetForeignKeyProperties(associationEntry, otherEntry, skipNavigation.Inverse.ForeignKey, setModified, fromQuery); + SetForeignKeyProperties(joinEntry, entry, skipNavigation.ForeignKey, setModified, fromQuery); + SetForeignKeyProperties(joinEntry, otherEntry, skipNavigation.Inverse.ForeignKey, setModified, fromQuery); - return associationEntry; + return joinEntry; } - private static InternalEntityEntry FindAssociationEntry( + private static InternalEntityEntry FindJoinEntry( InternalEntityEntry entry, InternalEntityEntry otherEntry, ISkipNavigation skipNavigation) { - var associationEntityType = skipNavigation.AssociationEntityType; + var joinEntityType = skipNavigation.JoinEntityType; var foreignKey = skipNavigation.ForeignKey; var otherForeignKey = skipNavigation.Inverse.ForeignKey; if (foreignKey.Properties.Count == 1 && otherForeignKey.Properties.Count == 1) { - if (TryFind(entry, otherEntry, foreignKey, otherForeignKey, out var associationEntry)) + if (TryFind(entry, otherEntry, foreignKey, otherForeignKey, out var joinEntry)) { - return associationEntry; + return joinEntry; } - if (TryFind(otherEntry, entry, otherForeignKey, foreignKey, out associationEntry)) + if (TryFind(otherEntry, entry, otherForeignKey, foreignKey, out joinEntry)) { - return associationEntry; + return joinEntry; } } @@ -988,9 +988,9 @@ bool TryFind( InternalEntityEntry secondEntry, IForeignKey firstForeignKey, IForeignKey secondForeignKey, - out InternalEntityEntry associationEntry) + out InternalEntityEntry joinEntry) { - var key = associationEntityType.FindKey(new[] { firstForeignKey.Properties[0], secondForeignKey.Properties[0] }); + var key = joinEntityType.FindKey(new[] { firstForeignKey.Properties[0], secondForeignKey.Properties[0] }); if (key != null) { var keyValues = new[] @@ -999,12 +999,12 @@ bool TryFind( secondEntry[secondForeignKey.PrincipalKey.Properties[0]] }; { - associationEntry = entry.StateManager.TryGetEntry(key, keyValues); + joinEntry = entry.StateManager.TryGetEntry(key, keyValues); return true; } } - associationEntry = null; + joinEntry = null; return false; } } diff --git a/src/EFCore/Metadata/Builders/CollectionCollectionBuilder.cs b/src/EFCore/Metadata/Builders/CollectionCollectionBuilder.cs index 18ab761bc0b..52cdff7b2c4 100644 --- a/src/EFCore/Metadata/Builders/CollectionCollectionBuilder.cs +++ b/src/EFCore/Metadata/Builders/CollectionCollectionBuilder.cs @@ -84,20 +84,20 @@ public CollectionCollectionBuilder( protected virtual InternalModelBuilder ModelBuilder => LeftEntityType.AsEntityType().Model.Builder; /// - /// Configures the association entity type implementing the many-to-many relationship. + /// Configures the join entity type implementing the many-to-many relationship. /// - /// The configuration of the association type. + /// The configuration of the join entity type. /// The builder for the originating entity type so that multiple configuration calls can be chained. public virtual EntityTypeBuilder UsingEntity( - [NotNull] Action configureAssociation) + [NotNull] Action configureJoinEntityType) { - Check.DebugAssert(LeftNavigation.AssociationEntityType != null, "LeftNavigation.AssociationEntityType is null"); - Check.DebugAssert(RightNavigation.AssociationEntityType != null, "RightNavigation.AssociationEntityType is null"); - Check.DebugAssert(LeftNavigation.AssociationEntityType == RightNavigation.AssociationEntityType, - "LeftNavigation.AssociationEntityType != RightNavigation.AssociationEntityType"); + Check.DebugAssert(LeftNavigation.JoinEntityType != null, "LeftNavigation.JoinEntityType is null"); + Check.DebugAssert(RightNavigation.JoinEntityType != null, "RightNavigation.JoinEntityType is null"); + Check.DebugAssert(LeftNavigation.JoinEntityType == RightNavigation.JoinEntityType, + "LeftNavigation.JoinEntityType != RightNavigation.JoinEntityType"); - var associationEntityTypeBuilder = new EntityTypeBuilder(LeftNavigation.AssociationEntityType); - configureAssociation(associationEntityTypeBuilder); + var joinEntityTypeBuilder = new EntityTypeBuilder(LeftNavigation.JoinEntityType); + configureJoinEntityType(joinEntityTypeBuilder); return new EntityTypeBuilder(RightEntityType); } @@ -105,43 +105,43 @@ public virtual EntityTypeBuilder UsingEntity( /// /// Configures the relationships to the entity types participating in the many-to-many relationship. /// - /// The CLR type of the join entity. + /// The CLR type of the join entity. /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The builder for the association type. + /// The builder for the join entity type. public virtual EntityTypeBuilder UsingEntity( - [NotNull] Type joinEntityType, + [NotNull] Type joinEntityClrType, [NotNull] Func configureRight, [NotNull] Func configureLeft) { - Check.NotNull(joinEntityType, nameof(joinEntityType)); + Check.NotNull(joinEntityClrType, nameof(joinEntityClrType)); Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); - var existingAssociationEntityType = (EntityType) + var existingjoinEntityType = (EntityType) (LeftNavigation.ForeignKey?.DeclaringEntityType ?? RightNavigation.ForeignKey?.DeclaringEntityType); - EntityType associationEntityType = null; - if (existingAssociationEntityType != null) + EntityType joinEntityType = null; + if (existingjoinEntityType != null) { - if (existingAssociationEntityType.ClrType == joinEntityType - && !existingAssociationEntityType.HasSharedClrType) + if (existingjoinEntityType.ClrType == joinEntityClrType + && !existingjoinEntityType.HasSharedClrType) { - associationEntityType = existingAssociationEntityType; + joinEntityType = existingjoinEntityType; } else { - ModelBuilder.RemoveAssociationEntityIfCreatedImplicitly( - existingAssociationEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); + ModelBuilder.RemoveJoinEntityIfCreatedImplicitly( + existingjoinEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); } } - if (associationEntityType == null) + if (joinEntityType == null) { - associationEntityType = ModelBuilder.Entity(joinEntityType, ConfigurationSource.Explicit).Metadata; + joinEntityType = ModelBuilder.Entity(joinEntityClrType, ConfigurationSource.Explicit).Metadata; } - var entityTypeBuilder = new EntityTypeBuilder(associationEntityType); + var entityTypeBuilder = new EntityTypeBuilder(joinEntityType); var leftForeignKey = configureLeft(entityTypeBuilder).Metadata; var rightForeignKey = configureRight(entityTypeBuilder).Metadata; @@ -155,58 +155,58 @@ public virtual EntityTypeBuilder UsingEntity( /// Configures the relationships to the entity types participating in the many-to-many relationship. /// /// The name of the join entity. - /// The CLR type of the join entity. + /// The CLR type of the join entity. /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The builder for the association type. + /// The builder for the join entity type. public virtual EntityTypeBuilder UsingEntity( [NotNull] string joinEntityName, - [NotNull] Type joinEntityType, + [NotNull] Type joinEntityClrType, [NotNull] Func configureRight, [NotNull] Func configureLeft) { Check.NotEmpty(joinEntityName, nameof(joinEntityName)); - Check.NotNull(joinEntityType, nameof(joinEntityType)); + Check.NotNull(joinEntityClrType, nameof(joinEntityClrType)); Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); - var existingAssociationEntityType = (EntityType) + var existingJoinEntityType = (EntityType) (LeftNavigation.ForeignKey?.DeclaringEntityType ?? RightNavigation.ForeignKey?.DeclaringEntityType); - EntityType associationEntityType = null; - if (existingAssociationEntityType != null) + EntityType joinEntityType = null; + if (existingJoinEntityType != null) { - if (existingAssociationEntityType.ClrType == joinEntityType - && string.Equals(existingAssociationEntityType.Name, joinEntityName, StringComparison.Ordinal)) + if (existingJoinEntityType.ClrType == joinEntityClrType + && string.Equals(existingJoinEntityType.Name, joinEntityName, StringComparison.Ordinal)) { - associationEntityType = existingAssociationEntityType; + joinEntityType = existingJoinEntityType; } else { - ModelBuilder.RemoveAssociationEntityIfCreatedImplicitly( - existingAssociationEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); + ModelBuilder.RemoveJoinEntityIfCreatedImplicitly( + existingJoinEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); } } - if (associationEntityType == null) + if (joinEntityType == null) { var existingEntityType = ModelBuilder.Metadata.FindEntityType(joinEntityName); - if (existingEntityType?.ClrType == joinEntityType) + if (existingEntityType?.ClrType == joinEntityClrType) { - associationEntityType = existingEntityType; + joinEntityType = existingEntityType; } else { - if (!ModelBuilder.Metadata.IsShared(joinEntityType)) + if (!ModelBuilder.Metadata.IsShared(joinEntityClrType)) { - throw new InvalidOperationException(CoreStrings.TypeNotMarkedAsShared(joinEntityType.DisplayName())); + throw new InvalidOperationException(CoreStrings.TypeNotMarkedAsShared(joinEntityClrType.DisplayName())); } - associationEntityType = ModelBuilder.SharedEntity(joinEntityName, joinEntityType, ConfigurationSource.Explicit).Metadata; + joinEntityType = ModelBuilder.SharedEntity(joinEntityName, joinEntityClrType, ConfigurationSource.Explicit).Metadata; } } - var entityTypeBuilder = new EntityTypeBuilder(associationEntityType); + var entityTypeBuilder = new EntityTypeBuilder(joinEntityType); var leftForeignKey = configureLeft(entityTypeBuilder).Metadata; var rightForeignKey = configureRight(entityTypeBuilder).Metadata; @@ -222,21 +222,21 @@ public virtual EntityTypeBuilder UsingEntity( /// The CLR type of the join entity. /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The configuration of the association type. + /// The configuration of the join entity type. /// The builder for the originating entity type so that multiple configuration calls can be chained. public virtual EntityTypeBuilder UsingEntity( [NotNull] Type joinEntityType, [NotNull] Func configureRight, [NotNull] Func configureLeft, - [NotNull] Action configureAssociation) + [NotNull] Action configureJoinEntityType) { Check.NotNull(joinEntityType, nameof(joinEntityType)); Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); - Check.NotNull(configureAssociation, nameof(configureAssociation)); + Check.NotNull(configureJoinEntityType, nameof(configureJoinEntityType)); var entityTypeBuilder = UsingEntity(joinEntityType, configureRight, configureLeft); - configureAssociation(entityTypeBuilder); + configureJoinEntityType(entityTypeBuilder); return new EntityTypeBuilder(RightEntityType); } @@ -248,23 +248,23 @@ public virtual EntityTypeBuilder UsingEntity( /// The CLR type of the join entity. /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The configuration of the association type. + /// The configuration of the join entity type. /// The builder for the originating entity type so that multiple configuration calls can be chained. public virtual EntityTypeBuilder UsingEntity( [NotNull] string joinEntityName, [NotNull] Type joinEntityType, [NotNull] Func configureRight, [NotNull] Func configureLeft, - [NotNull] Action configureAssociation) + [NotNull] Action configureJoinEntityType) { Check.NotEmpty(joinEntityName, nameof(joinEntityName)); Check.NotNull(joinEntityType, nameof(joinEntityType)); Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); - Check.NotNull(configureAssociation, nameof(configureAssociation)); + Check.NotNull(configureJoinEntityType, nameof(configureJoinEntityType)); var entityTypeBuilder = UsingEntity(joinEntityName, joinEntityType, configureRight, configureLeft); - configureAssociation(entityTypeBuilder); + configureJoinEntityType(entityTypeBuilder); return new EntityTypeBuilder(RightEntityType); } diff --git a/src/EFCore/Metadata/Builders/CollectionCollectionBuilder`.cs b/src/EFCore/Metadata/Builders/CollectionCollectionBuilder`.cs index f4c71151464..86404c41647 100644 --- a/src/EFCore/Metadata/Builders/CollectionCollectionBuilder`.cs +++ b/src/EFCore/Metadata/Builders/CollectionCollectionBuilder`.cs @@ -42,20 +42,20 @@ public CollectionCollectionBuilder( } /// - /// Configures the association entity type implementing the many-to-many relationship. + /// Configures the join entity type implementing the many-to-many relationship. /// - /// The configuration of the association type. + /// The configuration of the join entity type. /// The builder for the originating entity type so that multiple configuration calls can be chained. public new virtual EntityTypeBuilder UsingEntity( - [NotNull] Action configureAssociation) + [NotNull] Action configureJoinEntityType) { - Check.DebugAssert(LeftNavigation.AssociationEntityType != null, "LeftNavigation.AssociationEntityType is null"); - Check.DebugAssert(RightNavigation.AssociationEntityType != null, "RightNavigation.AssociationEntityType is null"); - Check.DebugAssert(LeftNavigation.AssociationEntityType == RightNavigation.AssociationEntityType, - "LeftNavigation.AssociationEntityType != RightNavigation.AssociationEntityType"); + Check.DebugAssert(LeftNavigation.JoinEntityType != null, "LeftNavigation.JoinEntityType is null"); + Check.DebugAssert(RightNavigation.JoinEntityType != null, "RightNavigation.JoinEntityType is null"); + Check.DebugAssert(LeftNavigation.JoinEntityType == RightNavigation.JoinEntityType, + "LeftNavigation.JoinEntityType != RightNavigation.JoinEntityType"); - var associationEntityTypeBuilder = new EntityTypeBuilder(LeftNavigation.AssociationEntityType); - configureAssociation(associationEntityTypeBuilder); + var joinEntityTypeBuilder = new EntityTypeBuilder(LeftNavigation.JoinEntityType); + configureJoinEntityType(joinEntityTypeBuilder); return new EntityTypeBuilder(RightEntityType); } @@ -65,40 +65,40 @@ public CollectionCollectionBuilder( /// /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The type of the association entity. - /// The builder for the association type. - public virtual EntityTypeBuilder UsingEntity( - [NotNull] Func, ReferenceCollectionBuilder> configureRight, - [NotNull] Func, ReferenceCollectionBuilder> configureLeft) - where TAssociationEntity : class + /// The CLR type of the join entity. + /// The builder for the join type. + public virtual EntityTypeBuilder UsingEntity( + [NotNull] Func, ReferenceCollectionBuilder> configureRight, + [NotNull] Func, ReferenceCollectionBuilder> configureLeft) + where TJoinEntity : class { Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); - var existingAssociationEntityType = (EntityType) + var existingJoinEntityType = (EntityType) (LeftNavigation.ForeignKey?.DeclaringEntityType ?? RightNavigation.ForeignKey?.DeclaringEntityType); - EntityType associationEntityType = null; - if (existingAssociationEntityType != null) + EntityType joinEntityType = null; + if (existingJoinEntityType != null) { - if (existingAssociationEntityType.ClrType == typeof(TAssociationEntity) - && !existingAssociationEntityType.HasSharedClrType) + if (existingJoinEntityType.ClrType == typeof(TJoinEntity) + && !existingJoinEntityType.HasSharedClrType) { - associationEntityType = existingAssociationEntityType; + joinEntityType = existingJoinEntityType; } else { - ModelBuilder.RemoveAssociationEntityIfCreatedImplicitly( - existingAssociationEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); + ModelBuilder.RemoveJoinEntityIfCreatedImplicitly( + existingJoinEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); } } - if (associationEntityType == null) + if (joinEntityType == null) { - associationEntityType = ModelBuilder.Entity(typeof(TAssociationEntity), ConfigurationSource.Explicit).Metadata; + joinEntityType = ModelBuilder.Entity(typeof(TJoinEntity), ConfigurationSource.Explicit).Metadata; } - var entityTypeBuilder = new EntityTypeBuilder(associationEntityType); + var entityTypeBuilder = new EntityTypeBuilder(joinEntityType); var leftForeignKey = configureLeft(entityTypeBuilder).Metadata; var rightForeignKey = configureRight(entityTypeBuilder).Metadata; @@ -111,58 +111,58 @@ public virtual EntityTypeBuilder UsingEntity /// Configures the relationships to the entity types participating in the many-to-many relationship. /// - /// The name of the association entity. + /// The name of the join entity. /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The type of the association entity. - /// The builder for the association type. - public virtual EntityTypeBuilder UsingEntity( + /// The CLR type of the join entity. + /// The builder for the join entity type. + public virtual EntityTypeBuilder UsingEntity( [NotNull] string joinEntityName, - [NotNull] Func, ReferenceCollectionBuilder> configureRight, - [NotNull] Func, ReferenceCollectionBuilder> configureLeft) - where TAssociationEntity : class + [NotNull] Func, ReferenceCollectionBuilder> configureRight, + [NotNull] Func, ReferenceCollectionBuilder> configureLeft) + where TJoinEntity : class { Check.NotEmpty(joinEntityName, nameof(joinEntityName)); Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); - var existingAssociationEntityType = (EntityType) + var existingJoinEntityType = (EntityType) (LeftNavigation.ForeignKey?.DeclaringEntityType ?? RightNavigation.ForeignKey?.DeclaringEntityType); - EntityType associationEntityType = null; - if (existingAssociationEntityType != null) + EntityType joinEntityType = null; + if (existingJoinEntityType != null) { - if (existingAssociationEntityType.ClrType == typeof(TAssociationEntity) - && string.Equals(existingAssociationEntityType.Name, joinEntityName, StringComparison.Ordinal)) + if (existingJoinEntityType.ClrType == typeof(TJoinEntity) + && string.Equals(existingJoinEntityType.Name, joinEntityName, StringComparison.Ordinal)) { - associationEntityType = existingAssociationEntityType; + joinEntityType = existingJoinEntityType; } else { - ModelBuilder.RemoveAssociationEntityIfCreatedImplicitly( - existingAssociationEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); + ModelBuilder.RemoveJoinEntityIfCreatedImplicitly( + existingJoinEntityType, removeSkipNavigations: false, ConfigurationSource.Explicit); } } - if (associationEntityType == null) + if (joinEntityType == null) { var existingEntityType = ModelBuilder.Metadata.FindEntityType(joinEntityName); - if (existingEntityType?.ClrType == typeof(TAssociationEntity)) + if (existingEntityType?.ClrType == typeof(TJoinEntity)) { - associationEntityType = existingEntityType; + joinEntityType = existingEntityType; } else { - if (!ModelBuilder.Metadata.IsShared(typeof(TAssociationEntity))) + if (!ModelBuilder.Metadata.IsShared(typeof(TJoinEntity))) { - throw new InvalidOperationException(CoreStrings.TypeNotMarkedAsShared(typeof(TAssociationEntity).DisplayName())); + throw new InvalidOperationException(CoreStrings.TypeNotMarkedAsShared(typeof(TJoinEntity).DisplayName())); } - associationEntityType = ModelBuilder.SharedEntity(joinEntityName, typeof(TAssociationEntity), ConfigurationSource.Explicit).Metadata; + joinEntityType = ModelBuilder.SharedEntity(joinEntityName, typeof(TJoinEntity), ConfigurationSource.Explicit).Metadata; } } - var entityTypeBuilder = new EntityTypeBuilder(associationEntityType); + var entityTypeBuilder = new EntityTypeBuilder(joinEntityType); var leftForeignKey = configureLeft(entityTypeBuilder).Metadata; var rightForeignKey = configureRight(entityTypeBuilder).Metadata; @@ -177,20 +177,20 @@ public virtual EntityTypeBuilder UsingEntity /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The configuration of the association type. - /// The type of the association entity. + /// The configuration of the join entity type. + /// The CLR type of the join entity. /// The builder for the originating entity type so that multiple configuration calls can be chained. - public virtual EntityTypeBuilder UsingEntity( - [NotNull] Func, ReferenceCollectionBuilder> configureRight, - [NotNull] Func, ReferenceCollectionBuilder> configureLeft, - [NotNull] Action> configureAssociation) - where TAssociationEntity : class + public virtual EntityTypeBuilder UsingEntity( + [NotNull] Func, ReferenceCollectionBuilder> configureRight, + [NotNull] Func, ReferenceCollectionBuilder> configureLeft, + [NotNull] Action> configureJoinEntityType) + where TJoinEntity : class { Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); var entityTypeBuilder = UsingEntity(configureRight, configureLeft); - configureAssociation(entityTypeBuilder); + configureJoinEntityType(entityTypeBuilder); return new EntityTypeBuilder(RightEntityType); } @@ -198,26 +198,26 @@ public virtual EntityTypeBuilder UsingEntity( /// /// Configures the relationships to the entity types participating in the many-to-many relationship. /// - /// The name of the association entity. + /// The name of the join entity. /// The configuration for the relationship to the right entity type. /// The configuration for the relationship to the left entity type. - /// The configuration of the association type. - /// The type of the association entity. + /// The configuration of the join entity type. + /// The CLR type of the join entity. /// The builder for the originating entity type so that multiple configuration calls can be chained. - public virtual EntityTypeBuilder UsingEntity( + public virtual EntityTypeBuilder UsingEntity( [NotNull] string joinEntityName, - [NotNull] Func, ReferenceCollectionBuilder> configureRight, - [NotNull] Func, ReferenceCollectionBuilder> configureLeft, - [NotNull] Action> configureAssociation) - where TAssociationEntity : class + [NotNull] Func, ReferenceCollectionBuilder> configureRight, + [NotNull] Func, ReferenceCollectionBuilder> configureLeft, + [NotNull] Action> configureJoinEntityType) + where TJoinEntity : class { Check.NotEmpty(joinEntityName, nameof(joinEntityName)); Check.NotNull(configureRight, nameof(configureRight)); Check.NotNull(configureLeft, nameof(configureLeft)); - Check.NotNull(configureAssociation, nameof(configureAssociation)); + Check.NotNull(configureJoinEntityType, nameof(configureJoinEntityType)); var entityTypeBuilder = UsingEntity(joinEntityName, configureRight, configureLeft); - configureAssociation(entityTypeBuilder); + configureJoinEntityType(entityTypeBuilder); return new EntityTypeBuilder(RightEntityType); } diff --git a/src/EFCore/Metadata/Builders/CollectionNavigationBuilder.cs b/src/EFCore/Metadata/Builders/CollectionNavigationBuilder.cs index f0c396da96a..1b989d5ba2e 100644 --- a/src/EFCore/Metadata/Builders/CollectionNavigationBuilder.cs +++ b/src/EFCore/Metadata/Builders/CollectionNavigationBuilder.cs @@ -171,8 +171,8 @@ private InternalForeignKeyBuilder WithOneBuilder(MemberIdentity reference) var navigationName = SkipNavigation.Name; var declaringEntityType = (EntityType)DeclaringEntityType; declaringEntityType.Model.Builder - .RemoveAssociationEntityIfCreatedImplicitly( - (EntityType)SkipNavigation.AssociationEntityType, + .RemoveJoinEntityIfCreatedImplicitly( + (EntityType)SkipNavigation.JoinEntityType, removeSkipNavigations: true, ConfigurationSource.Explicit); diff --git a/src/EFCore/Metadata/Conventions/Infrastructure/ProviderConventionSetBuilder.cs b/src/EFCore/Metadata/Conventions/Infrastructure/ProviderConventionSetBuilder.cs index 56457bb2893..583b45fbc15 100644 --- a/src/EFCore/Metadata/Conventions/Infrastructure/ProviderConventionSetBuilder.cs +++ b/src/EFCore/Metadata/Conventions/Infrastructure/ProviderConventionSetBuilder.cs @@ -183,7 +183,7 @@ public virtual ConventionSet CreateConventionSet() conventionSet.NavigationRemovedConventions.Add(relationshipDiscoveryConvention); - conventionSet.SkipNavigationAddedConventions.Add(new ManyToManyAssociationEntityTypeConvention(Dependencies)); + conventionSet.SkipNavigationAddedConventions.Add(new ManyToManyJoinEntityTypeConvention(Dependencies)); conventionSet.IndexAddedConventions.Add(foreignKeyIndexConvention); diff --git a/src/EFCore/Metadata/Conventions/ManyToManyAssociationEntityTypeConvention.cs b/src/EFCore/Metadata/Conventions/ManyToManyAssociationEntityTypeConvention.cs index 8cbf10370a7..041a2d4ea00 100644 --- a/src/EFCore/Metadata/Conventions/ManyToManyAssociationEntityTypeConvention.cs +++ b/src/EFCore/Metadata/Conventions/ManyToManyAssociationEntityTypeConvention.cs @@ -14,19 +14,19 @@ namespace Microsoft.EntityFrameworkCore.Metadata.Conventions { /// /// A convention which looks for matching skip navigations and automatically creates - /// a many-to-many association entity with suitable foreign keys, sets the two + /// a many-to-many join entity with suitable foreign keys, sets the two /// matching skip navigations to use those foreign keys. /// - public class ManyToManyAssociationEntityTypeConvention : ISkipNavigationAddedConvention, ISkipNavigationInverseChangedConvention + public class ManyToManyJoinEntityTypeConvention : ISkipNavigationAddedConvention, ISkipNavigationInverseChangedConvention { - private const string AssociationEntityTypeNameTemplate = "{0}{1}"; - private const string AssociationPropertyNameTemplate = "{0}_{1}"; + private const string JoinEntityTypeNameTemplate = "{0}{1}"; + private const string JoinPropertyNameTemplate = "{0}_{1}"; /// - /// Creates a new instance of . + /// Creates a new instance of . /// /// Parameter object containing dependencies for this convention. - public ManyToManyAssociationEntityTypeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) + public ManyToManyJoinEntityTypeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) { Dependencies = dependencies; } @@ -44,7 +44,7 @@ public virtual void ProcessSkipNavigationAdded( Check.NotNull(skipNavigationBuilder, nameof(skipNavigationBuilder)); Check.NotNull(context, nameof(context)); - CreateAssociationEntityType(skipNavigationBuilder); + CreateJoinEntityType(skipNavigationBuilder); } /// @@ -57,14 +57,14 @@ public virtual void ProcessSkipNavigationInverseChanged( Check.NotNull(skipNavigationBuilder, nameof(skipNavigationBuilder)); Check.NotNull(context, nameof(context)); - CreateAssociationEntityType(skipNavigationBuilder); + CreateJoinEntityType(skipNavigationBuilder); } - private void CreateAssociationEntityType( + private void CreateJoinEntityType( IConventionSkipNavigationBuilder skipNavigationBuilder) { var skipNavigation = (SkipNavigation)skipNavigationBuilder.Metadata; - if (skipNavigation.AssociationEntityType != null) + if (skipNavigation.JoinEntityType != null) { return; } @@ -73,7 +73,7 @@ private void CreateAssociationEntityType( || skipNavigation.TargetEntityType == skipNavigation.DeclaringEntityType || !skipNavigation.IsCollection) { - // do not create the association entity type for a self-referencing + // do not create the join entity type for a self-referencing // skip navigation, or for one that is already "in use" // (i.e. has its Foreign Key assigned). return; @@ -84,7 +84,7 @@ private void CreateAssociationEntityType( || inverseSkipNavigation.ForeignKey != null || !inverseSkipNavigation.IsCollection) { - // do not create the association entity type if + // do not create the join entity type if // the inverse skip navigation is already "in use" // (i.e. has its Foreign Key assigned). return; @@ -97,43 +97,43 @@ private void CreateAssociationEntityType( var inverseEntityType = inverseSkipNavigation.DeclaringEntityType; var model = declaringEntityType.Model; - // create the association entity type - var associationEntityTypeName = string.Format( - AssociationEntityTypeNameTemplate, + // create the join entity type + var joinEntityTypeName = string.Format( + JoinEntityTypeNameTemplate, declaringEntityType.ShortName(), inverseEntityType.ShortName()); - if (model.FindEntityType(associationEntityTypeName) != null) + if (model.FindEntityType(joinEntityTypeName) != null) { var otherIdentifiers = model.GetEntityTypes().ToDictionary(et => et.Name, et => 0); - associationEntityTypeName = Uniquifier.Uniquify( - associationEntityTypeName, + joinEntityTypeName = Uniquifier.Uniquify( + joinEntityTypeName, otherIdentifiers, int.MaxValue); } - var associationEntityTypeBuilder = model.Builder.SharedEntity( - associationEntityTypeName, Model.DefaultPropertyBagType, ConfigurationSource.Convention); + var joinEntityTypeBuilder = model.Builder.SharedEntity( + joinEntityTypeName, Model.DefaultPropertyBagType, ConfigurationSource.Convention); // Create left and right foreign keys from the outer entity types to - // the association entity type and configure the skip navigations. + // the join entity type and configure the skip navigations. // Roll back if any of this fails. var leftForeignKey = - CreateSkipNavigationForeignKey(skipNavigation, associationEntityTypeBuilder); + CreateSkipNavigationForeignKey(skipNavigation, joinEntityTypeBuilder); if (leftForeignKey == null) { model.Builder.HasNoEntityType( - associationEntityTypeBuilder.Metadata, ConfigurationSource.Convention); + joinEntityTypeBuilder.Metadata, ConfigurationSource.Convention); return; } var rightForeignKey = - CreateSkipNavigationForeignKey(inverseSkipNavigation, associationEntityTypeBuilder); + CreateSkipNavigationForeignKey(inverseSkipNavigation, joinEntityTypeBuilder); if (rightForeignKey == null) { - // Removing the association entity type will also remove + // Removing the join entity type will also remove // the leftForeignKey created above. model.Builder.HasNoEntityType( - associationEntityTypeBuilder.Metadata, ConfigurationSource.Convention); + joinEntityTypeBuilder.Metadata, ConfigurationSource.Convention); return; } @@ -142,14 +142,14 @@ private void CreateAssociationEntityType( // Creating the primary key below also negates the need for an index on // the properties of leftForeignKey - that index is automatically removed. - associationEntityTypeBuilder.PrimaryKey( + joinEntityTypeBuilder.PrimaryKey( leftForeignKey.Properties.Concat(rightForeignKey.Properties).ToList(), ConfigurationSource.Convention); } private static ForeignKey CreateSkipNavigationForeignKey( SkipNavigation skipNavigation, - InternalEntityTypeBuilder associationEntityTypeBuilder) + InternalEntityTypeBuilder joinEntityTypeBuilder) { var principalEntityType = skipNavigation.DeclaringEntityType; var principalKey = principalEntityType.FindPrimaryKey(); @@ -159,13 +159,13 @@ private static ForeignKey CreateSkipNavigationForeignKey( } var dependentEndForeignKeyPropertyNames = new List(); - var otherIdentifiers = associationEntityTypeBuilder.Metadata + var otherIdentifiers = joinEntityTypeBuilder.Metadata .GetDeclaredProperties().ToDictionary(p => p.Name, p => 0); foreach (var property in principalKey.Properties) { var propertyName = Uniquifier.Uniquify( string.Format( - AssociationPropertyNameTemplate, + JoinPropertyNameTemplate, principalEntityType.ShortName(), property.Name), otherIdentifiers, @@ -174,7 +174,7 @@ private static ForeignKey CreateSkipNavigationForeignKey( otherIdentifiers.Add(propertyName, 0); } - return associationEntityTypeBuilder + return joinEntityTypeBuilder .HasRelationship( principalEntityType.Name, dependentEndForeignKeyPropertyNames, diff --git a/src/EFCore/Metadata/Conventions/ModelCleanupConvention.cs b/src/EFCore/Metadata/Conventions/ModelCleanupConvention.cs index 6a6f2d9e0fc..97c7d53ad59 100644 --- a/src/EFCore/Metadata/Conventions/ModelCleanupConvention.cs +++ b/src/EFCore/Metadata/Conventions/ModelCleanupConvention.cs @@ -72,7 +72,7 @@ private IReadOnlyList GetRoots(IConventionModel model, Co private void RemoveNavigationlessForeignKeys(IConventionModelBuilder modelBuilder) { foreach (var entityType in modelBuilder.Metadata.GetEntityTypes() - .Where(e => !((EntityType)e).IsImplicitlyCreatedAssociationEntityType)) + .Where(e => !((EntityType)e).IsImplicitlyCreatedJoinEntityType)) { foreach (var foreignKey in entityType.GetDeclaredForeignKeys().ToList()) { diff --git a/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs b/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs index 0a48f6fd6df..f8789a0fc91 100644 --- a/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs +++ b/src/EFCore/Metadata/Conventions/RelationshipDiscoveryConvention.cs @@ -747,17 +747,17 @@ private void RemoveNavigation( } else { - var associationEntityType = (EntityType)declaringEntityType + var joinEntityType = (EntityType)declaringEntityType .FindDeclaredSkipNavigation(navigationPropertyName)? .ForeignKey?.DeclaringEntityType; - if (associationEntityType != null) + if (joinEntityType != null) { - var modelBuilder = associationEntityType.Model.Builder; + var modelBuilder = joinEntityType.Model.Builder; // The PropertyInfo underlying this skip navigation has become - // ambiguous since we used it, so remove the association entity + // ambiguous since we used it, so remove the join entity // if it was implicitly created. - if (modelBuilder.RemoveAssociationEntityIfCreatedImplicitly( - associationEntityType, removeSkipNavigations: true, ConfigurationSource.Convention) == null) + if (modelBuilder.RemoveJoinEntityIfCreatedImplicitly( + joinEntityType, removeSkipNavigations: true, ConfigurationSource.Convention) == null) { // Navigations of higher configuration source are not ambiguous toRemoveFrom.Remove(navigationProperty); @@ -783,7 +783,7 @@ private void HasManyToManyRelationship( if (navigationTargetType == inverseTargetType) { - // do not automatically create many-to-many associations to self + // do not automatically create many-to-many joins to self return; } @@ -829,7 +829,7 @@ private void HasManyToManyRelationship( // also sets rightSkipNavigation's inverse leftSkipNavigation.Builder.HasInverse(rightSkipNavigation, fromDataAnnotation: false); - // the implicit many-to-many association entity type will be created + // the implicit many-to-many join entity type will be created // and configured by ManyToManyAssocationEntityTypeConvention. } diff --git a/src/EFCore/Metadata/IConventionSkipNavigation.cs b/src/EFCore/Metadata/IConventionSkipNavigation.cs index 46582193e6f..000d7c9a79c 100644 --- a/src/EFCore/Metadata/IConventionSkipNavigation.cs +++ b/src/EFCore/Metadata/IConventionSkipNavigation.cs @@ -25,16 +25,16 @@ public interface IConventionSkipNavigation : ISkipNavigation, IConventionNavigat new IConventionSkipNavigationBuilder Builder { get; } /// - /// Gets the association type used by the foreign key. + /// Gets the join type used by the foreign key. /// - new IConventionEntityType AssociationEntityType + new IConventionEntityType JoinEntityType { [DebuggerStepThrough] - get => (IConventionEntityType)((ISkipNavigation)this).AssociationEntityType; + get => (IConventionEntityType)((ISkipNavigation)this).JoinEntityType; } /// - /// Gets the foreign key to the association type. + /// Gets the foreign key to the join type. /// new IConventionForeignKey ForeignKey { diff --git a/src/EFCore/Metadata/IMutableSkipNavigation.cs b/src/EFCore/Metadata/IMutableSkipNavigation.cs index e226c909d6e..19d77c251e9 100644 --- a/src/EFCore/Metadata/IMutableSkipNavigation.cs +++ b/src/EFCore/Metadata/IMutableSkipNavigation.cs @@ -19,16 +19,16 @@ namespace Microsoft.EntityFrameworkCore.Metadata public interface IMutableSkipNavigation : ISkipNavigation, IMutableNavigationBase { /// - /// Gets the association type used by the foreign key. + /// Gets the join type used by the foreign key. /// - new IMutableEntityType AssociationEntityType + new IMutableEntityType JoinEntityType { [DebuggerStepThrough] - get => (IMutableEntityType)((ISkipNavigation)this).AssociationEntityType; + get => (IMutableEntityType)((ISkipNavigation)this).JoinEntityType; } /// - /// Gets the foreign key to the association type. + /// Gets the foreign key to the join type. /// new IMutableForeignKey ForeignKey { diff --git a/src/EFCore/Metadata/ISkipNavigation.cs b/src/EFCore/Metadata/ISkipNavigation.cs index da1f33dfd0c..ba54c80fe30 100644 --- a/src/EFCore/Metadata/ISkipNavigation.cs +++ b/src/EFCore/Metadata/ISkipNavigation.cs @@ -13,9 +13,9 @@ namespace Microsoft.EntityFrameworkCore.Metadata public interface ISkipNavigation : INavigationBase { /// - /// Gets the association type used by the foreign key. + /// Gets the join type used by the foreign key. /// - IEntityType AssociationEntityType => IsOnDependent ? ForeignKey?.PrincipalEntityType : ForeignKey?.DeclaringEntityType; + IEntityType JoinEntityType => IsOnDependent ? ForeignKey?.PrincipalEntityType : ForeignKey?.DeclaringEntityType; /// /// Gets the inverse skip navigation. @@ -32,7 +32,7 @@ INavigationBase INavigationBase.Inverse } /// - /// Gets the foreign key to the association type. + /// Gets the foreign key to the join type. /// IForeignKey ForeignKey { get; } diff --git a/src/EFCore/Metadata/Internal/EntityType.cs b/src/EFCore/Metadata/Internal/EntityType.cs index e3c209299dc..e09c90f46ce 100644 --- a/src/EFCore/Metadata/Internal/EntityType.cs +++ b/src/EFCore/Metadata/Internal/EntityType.cs @@ -3175,7 +3175,7 @@ public virtual void CheckDiscriminatorValue([NotNull] IEntityType entityType, [C /// 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. /// - public virtual bool IsImplicitlyCreatedAssociationEntityType + public virtual bool IsImplicitlyCreatedJoinEntityType => GetConfigurationSource() == ConfigurationSource.Convention && ClrType == Model.DefaultPropertyBagType; diff --git a/src/EFCore/Metadata/Internal/InternalModelBuilder.cs b/src/EFCore/Metadata/Internal/InternalModelBuilder.cs index 90d63fb9e43..9dd592fa9b3 100644 --- a/src/EFCore/Metadata/Internal/InternalModelBuilder.cs +++ b/src/EFCore/Metadata/Internal/InternalModelBuilder.cs @@ -258,21 +258,21 @@ private InternalEntityTypeBuilder Entity( /// 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. /// - public virtual InternalModelBuilder RemoveAssociationEntityIfCreatedImplicitly( - [NotNull] EntityType associationEntityType, + public virtual InternalModelBuilder RemoveJoinEntityIfCreatedImplicitly( + [NotNull] EntityType joinEntityType, bool removeSkipNavigations, ConfigurationSource configurationSource) { - Check.NotNull(associationEntityType, nameof(associationEntityType)); + Check.NotNull(joinEntityType, nameof(joinEntityType)); - if (!associationEntityType.IsImplicitlyCreatedAssociationEntityType) + if (!joinEntityType.IsImplicitlyCreatedJoinEntityType) { return null; } - Debug.Assert(associationEntityType.GetForeignKeys().Count() == 2, - "Implicitly created association entity types should have exactly 2 foreign keys"); - foreach (var fk in associationEntityType.GetForeignKeys()) + Debug.Assert(joinEntityType.GetForeignKeys().Count() == 2, + "Implicitly created join entity types should have exactly 2 foreign keys"); + foreach (var fk in joinEntityType.GetForeignKeys()) { var skipNavigation = fk.GetReferencingSkipNavigations().FirstOrDefault(); if (skipNavigation != null) @@ -289,7 +289,7 @@ public virtual InternalModelBuilder RemoveAssociationEntityIfCreatedImplicitly( } } - return HasNoEntityType(associationEntityType, configurationSource); + return HasNoEntityType(joinEntityType, configurationSource); } /// diff --git a/src/EFCore/Metadata/Internal/InternalSkipNavigationBuilder.cs b/src/EFCore/Metadata/Internal/InternalSkipNavigationBuilder.cs index 7b8ad1eee58..53d16f81d54 100644 --- a/src/EFCore/Metadata/Internal/InternalSkipNavigationBuilder.cs +++ b/src/EFCore/Metadata/Internal/InternalSkipNavigationBuilder.cs @@ -70,16 +70,16 @@ public virtual InternalSkipNavigationBuilder HasForeignKey([CanBeNull] ForeignKe foreignKey.UpdateConfigurationSource(configurationSource); } - if (Metadata.AssociationEntityType != null - && foreignKey?.DeclaringEntityType != Metadata.AssociationEntityType) + if (Metadata.JoinEntityType != null + && foreignKey?.DeclaringEntityType != Metadata.JoinEntityType) { // Have reset the foreign key of a skip navigation on one side of an - // association entity type to a different entity type. An implicit - // association entity type is only useful if both sides are + // join entity type to a different entity type. An implicit + // join entity type is only useful if both sides are // configured - so, if it is implicit, remove that entity type // (which will also remove the other skip navigation's foreign key). - Metadata.AssociationEntityType.Model.Builder.RemoveAssociationEntityIfCreatedImplicitly( - Metadata.AssociationEntityType, removeSkipNavigations: false, configurationSource); + Metadata.JoinEntityType.Model.Builder.RemoveJoinEntityIfCreatedImplicitly( + Metadata.JoinEntityType, removeSkipNavigations: false, configurationSource); } Metadata.SetForeignKey(foreignKey, configurationSource); @@ -109,9 +109,9 @@ public virtual bool CanSetForeignKey([CanBeNull] ForeignKey foreignKey, Configur return (Metadata.DeclaringEntityType == (Metadata.IsOnDependent ? foreignKey.DeclaringEntityType : foreignKey.PrincipalEntityType)) - && (Metadata.Inverse?.AssociationEntityType == null - || Metadata.Inverse.AssociationEntityType.IsImplicitlyCreatedAssociationEntityType == true - || Metadata.Inverse.AssociationEntityType + && (Metadata.Inverse?.JoinEntityType == null + || Metadata.Inverse.JoinEntityType.IsImplicitlyCreatedJoinEntityType == true + || Metadata.Inverse.JoinEntityType == (Metadata.IsOnDependent ? foreignKey.PrincipalEntityType : foreignKey.DeclaringEntityType)); } @@ -173,9 +173,9 @@ public virtual bool CanSetInverse( return Metadata.TargetEntityType == inverse.DeclaringEntityType && Metadata.DeclaringEntityType == inverse.TargetEntityType - && (Metadata.AssociationEntityType == null - || inverse.AssociationEntityType == null - || Metadata.AssociationEntityType == inverse.AssociationEntityType); + && (Metadata.JoinEntityType == null + || inverse.JoinEntityType == null + || Metadata.JoinEntityType == inverse.JoinEntityType); } /// diff --git a/src/EFCore/Metadata/Internal/SkipNavigation.cs b/src/EFCore/Metadata/Internal/SkipNavigation.cs index c405cbefc02..c1d73e64b8f 100644 --- a/src/EFCore/Metadata/Internal/SkipNavigation.cs +++ b/src/EFCore/Metadata/Internal/SkipNavigation.cs @@ -115,7 +115,7 @@ private void ProcessForeignKey(ForeignKey foreignKey) /// 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. /// - public virtual EntityType AssociationEntityType => IsOnDependent ? ForeignKey?.PrincipalEntityType : ForeignKey?.DeclaringEntityType; + public virtual EntityType JoinEntityType => IsOnDependent ? ForeignKey?.PrincipalEntityType : ForeignKey?.DeclaringEntityType; /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -190,13 +190,13 @@ public virtual ForeignKey SetForeignKey([CanBeNull] ForeignKey foreignKey, Confi ProcessForeignKey(foreignKey); UpdateForeignKeyConfigurationSource(configurationSource); - if (Inverse?.AssociationEntityType != null - && Inverse.AssociationEntityType != AssociationEntityType) + if (Inverse?.JoinEntityType != null + && Inverse.JoinEntityType != JoinEntityType) { throw new InvalidOperationException(CoreStrings.SkipInverseMismatchedForeignKey( foreignKey.Properties.Format(), - Name, AssociationEntityType.DisplayName(), - Inverse.Name, Inverse.AssociationEntityType.DisplayName())); + Name, JoinEntityType.DisplayName(), + Inverse.Name, Inverse.JoinEntityType.DisplayName())); } return isChanging @@ -250,12 +250,12 @@ public virtual SkipNavigation SetInverse([CanBeNull] SkipNavigation inverse, Con inverse.Name, inverse.DeclaringEntityType.DisplayName(), Name, TargetEntityType.DisplayName())); } - if (inverse.AssociationEntityType != null - && AssociationEntityType != null - && inverse.AssociationEntityType != AssociationEntityType) + if (inverse.JoinEntityType != null + && JoinEntityType != null + && inverse.JoinEntityType != JoinEntityType) { - throw new InvalidOperationException(CoreStrings.SkipInverseMismatchedAssociationType( - inverse.Name, inverse.AssociationEntityType.DisplayName(), Name, AssociationEntityType.DisplayName())); + throw new InvalidOperationException(CoreStrings.SkipInverseMismatchedJoinType( + inverse.Name, inverse.JoinEntityType.DisplayName(), Name, JoinEntityType.DisplayName())); } Inverse = inverse; diff --git a/src/EFCore/Properties/CoreStrings.Designer.cs b/src/EFCore/Properties/CoreStrings.Designer.cs index caec74accda..6a97f1c70a2 100644 --- a/src/EFCore/Properties/CoreStrings.Designer.cs +++ b/src/EFCore/Properties/CoreStrings.Designer.cs @@ -2295,12 +2295,12 @@ public static string SkipNavigationWrongType([CanBeNull] object navigation, [Can navigation, entityType, otherEntityType); /// - /// The skip navigation '{inverse}' using the association entity type '{inverseAssociationType}' cannot be set as the inverse of '{navigation}' that uses the association entity type '{associationType}'. The inverse should use the same association entity type. + /// The skip navigation '{inverse}' using the join entity type '{inverseJoinType}' cannot be set as the inverse of '{navigation}' that uses the join entity type '{joinType}'. The inverse should use the same join entity type. /// - public static string SkipInverseMismatchedAssociationType([CanBeNull] object inverse, [CanBeNull] object inverseAssociationType, [CanBeNull] object navigation, [CanBeNull] object associationType) + public static string SkipInverseMismatchedJoinType([CanBeNull] object inverse, [CanBeNull] object inverseJoinType, [CanBeNull] object navigation, [CanBeNull] object joinType) => string.Format( - GetString("SkipInverseMismatchedAssociationType", nameof(inverse), nameof(inverseAssociationType), nameof(navigation), nameof(associationType)), - inverse, inverseAssociationType, navigation, associationType); + GetString("SkipInverseMismatchedJoinType", nameof(inverse), nameof(inverseJoinType), nameof(navigation), nameof(joinType)), + inverse, inverseJoinType, navigation, joinType); /// /// The skip navigation '{navigation}' on entity type '{entityType}' doesn't have an inverse configured. Every skip navigation should have an inverse skip navigation. @@ -2319,12 +2319,12 @@ public static string SkipNavigationNonCollection([CanBeNull] object navigation, navigation, entityType); /// - /// The foreign key '{foreignKey}' cannot be set for the skip navigation '{navigation}' as it uses the association entity type '{associationType}' while the inverse skip navigation '{inverse}' is using the association entity type '{inverseAssociationType}'. The inverse should use the same association entity type. + /// The foreign key '{foreignKey}' cannot be set for the skip navigation '{navigation}' as it uses the join entity type '{joinType}' while the inverse skip navigation '{inverse}' is using the join entity type '{inverseJoinType}'. The inverse should use the same join entity type. /// - public static string SkipInverseMismatchedForeignKey([CanBeNull] object foreignKey, [CanBeNull] object navigation, [CanBeNull] object associationType, [CanBeNull] object inverse, [CanBeNull] object inverseAssociationType) + public static string SkipInverseMismatchedForeignKey([CanBeNull] object foreignKey, [CanBeNull] object navigation, [CanBeNull] object joinType, [CanBeNull] object inverse, [CanBeNull] object inverseJoinType) => string.Format( - GetString("SkipInverseMismatchedForeignKey", nameof(foreignKey), nameof(navigation), nameof(associationType), nameof(inverse), nameof(inverseAssociationType)), - foreignKey, navigation, associationType, inverse, inverseAssociationType); + GetString("SkipInverseMismatchedForeignKey", nameof(foreignKey), nameof(navigation), nameof(joinType), nameof(inverse), nameof(inverseJoinType)), + foreignKey, navigation, joinType, inverse, inverseJoinType); /// /// The skip navigation '{navigation}' on entity type '{entityType}' doesn't have a foreign key associated with it. Every skip navigation should have a configured foreign key. diff --git a/src/EFCore/Properties/CoreStrings.resx b/src/EFCore/Properties/CoreStrings.resx index 4c4ee5a7896..e42e4b1b7e9 100644 --- a/src/EFCore/Properties/CoreStrings.resx +++ b/src/EFCore/Properties/CoreStrings.resx @@ -1253,8 +1253,8 @@ The skip navigation property '{navigation}' cannot be removed from the entity type '{entityType}' because it is defined on the entity type '{otherEntityType}'. - - The skip navigation '{inverse}' using the association entity type '{inverseAssociationType}' cannot be set as the inverse of '{navigation}' that uses the association entity type '{associationType}'. The inverse should use the same association entity type. + + The skip navigation '{inverse}' using the join entity type '{inverseJoinType}' cannot be set as the inverse of '{navigation}' that uses the join entity type '{joinType}'. The inverse should use the same join entity type. The skip navigation '{navigation}' on entity type '{entityType}' doesn't have an inverse configured. Every skip navigation should have an inverse skip navigation. @@ -1263,7 +1263,7 @@ The skip navigation '{navigation}' on entity type '{entityType}' is not a collection. Only collection skip navigation properties are currently supported. - The foreign key '{foreignKey}' cannot be set for the skip navigation '{navigation}' as it uses the association entity type '{associationType}' while the inverse skip navigation '{inverse}' is using the association entity type '{inverseAssociationType}'. The inverse should use the same association entity type. + The foreign key '{foreignKey}' cannot be set for the skip navigation '{navigation}' as it uses the join entity type '{joinType}' while the inverse skip navigation '{inverse}' is using the join entity type '{inverseJoinType}'. The inverse should use the same join entity type. The skip navigation '{navigation}' on entity type '{entityType}' doesn't have a foreign key associated with it. Every skip navigation should have a configured foreign key. diff --git a/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs b/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs index 4a3f3248f45..6ff3f511caf 100644 --- a/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs +++ b/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs @@ -1184,9 +1184,9 @@ public virtual void Many_to_many_join_table_stored_in_snapshot() });", usingSystem: true), model => { - var associationEntity = model.FindEntityType("ManyToManyLeftManyToManyRight"); - Assert.NotNull(associationEntity); - Assert.Collection(associationEntity.GetDeclaredProperties(), + var joinEntity = model.FindEntityType("ManyToManyLeftManyToManyRight"); + Assert.NotNull(joinEntity); + Assert.Collection(joinEntity.GetDeclaredProperties(), p => { Assert.Equal("ManyToManyLeft_Id", p.Name); @@ -1197,7 +1197,7 @@ public virtual void Many_to_many_join_table_stored_in_snapshot() Assert.Equal("ManyToManyRight_Id", p.Name); Assert.True(p.IsShadowProperty()); }); - Assert.Collection(associationEntity.FindDeclaredPrimaryKey().Properties, + Assert.Collection(joinEntity.FindDeclaredPrimaryKey().Properties, p => { Assert.Equal("ManyToManyLeft_Id", p.Name); @@ -1206,7 +1206,7 @@ public virtual void Many_to_many_join_table_stored_in_snapshot() { Assert.Equal("ManyToManyRight_Id", p.Name); }); - Assert.Collection(associationEntity.GetDeclaredForeignKeys(), + Assert.Collection(joinEntity.GetDeclaredForeignKeys(), fk => { Assert.Equal("Microsoft.EntityFrameworkCore.Migrations.ModelSnapshotSqlServerTest+ManyToManyLeft", fk.PrincipalEntityType.Name); @@ -1315,10 +1315,10 @@ public virtual void Can_override_table_name_for_many_to_many_join_table_stored_i });", usingSystem: true), model => { - var associationEntity = model.FindEntityType("ManyToManyLeftManyToManyRight"); - Assert.NotNull(associationEntity); - Assert.Equal("MyJoinTable", associationEntity.GetTableName()); - Assert.Collection(associationEntity.GetDeclaredProperties(), + var joinEntity = model.FindEntityType("ManyToManyLeftManyToManyRight"); + Assert.NotNull(joinEntity); + Assert.Equal("MyJoinTable", joinEntity.GetTableName()); + Assert.Collection(joinEntity.GetDeclaredProperties(), p => { Assert.Equal("ManyToManyLeft_Id", p.Name); @@ -1329,7 +1329,7 @@ public virtual void Can_override_table_name_for_many_to_many_join_table_stored_i Assert.Equal("ManyToManyRight_Id", p.Name); Assert.True(p.IsShadowProperty()); }); - Assert.Collection(associationEntity.FindDeclaredPrimaryKey().Properties, + Assert.Collection(joinEntity.FindDeclaredPrimaryKey().Properties, p => { Assert.Equal("ManyToManyLeft_Id", p.Name); @@ -1338,7 +1338,7 @@ public virtual void Can_override_table_name_for_many_to_many_join_table_stored_i { Assert.Equal("ManyToManyRight_Id", p.Name); }); - Assert.Collection(associationEntity.GetDeclaredForeignKeys(), + Assert.Collection(joinEntity.GetDeclaredForeignKeys(), fk => { Assert.Equal("Microsoft.EntityFrameworkCore.Migrations.ModelSnapshotSqlServerTest+ManyToManyLeft", fk.PrincipalEntityType.Name); diff --git a/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs b/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs index 33fdd8b48a3..bc2bcfce96a 100644 --- a/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs +++ b/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs @@ -1764,12 +1764,12 @@ public virtual void Can_load_entities_in_any_order(int[] order) ValidateCounts(context, 152, 20, 20, 112); } - private static void ValidateCounts(DbContext context, int total, int ones, int twos, int associations) + private static void ValidateCounts(DbContext context, int total, int ones, int twos, int joins) { Assert.Equal(total, context.ChangeTracker.Entries().Count()); Assert.Equal(ones, context.ChangeTracker.Entries().Count()); Assert.Equal(twos, context.ChangeTracker.Entries().Count()); - Assert.Equal(associations, context.ChangeTracker.Entries().Count()); + Assert.Equal(joins, context.ChangeTracker.Entries().Count()); var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); @@ -1794,7 +1794,7 @@ private static void ValidateCounts(DbContext context, int total, int ones, int t } var deleted = context.ChangeTracker.Entries().Count(e => e.State == EntityState.Deleted); - Assert.Equal(associations, (joinCount / 2) + deleted); + Assert.Equal(joins, (joinCount / 2) + deleted); } protected ManyToManyTrackingTestBase(TFixture fixture) => Fixture = fixture; diff --git a/test/EFCore.Tests/Metadata/Conventions/ConventionDispatcherTest.cs b/test/EFCore.Tests/Metadata/Conventions/ConventionDispatcherTest.cs index 11110e12509..d6ce1b4835f 100644 --- a/test/EFCore.Tests/Metadata/Conventions/ConventionDispatcherTest.cs +++ b/test/EFCore.Tests/Metadata/Conventions/ConventionDispatcherTest.cs @@ -2097,9 +2097,9 @@ public void OnSkipNavigationForeignKeyChanged_calls_conventions_in_order(bool us var builder = new InternalModelBuilder(new Model(conventions)); var firstEntityBuilder = builder.Entity(typeof(Order), ConfigurationSource.Convention); var secondEntityBuilder = builder.Entity(typeof(Product), ConfigurationSource.Convention); - var associationEntityBuilder = builder.Entity(typeof(OrderProduct), ConfigurationSource.Convention); + var joinEntityBuilder = builder.Entity(typeof(OrderProduct), ConfigurationSource.Convention); - var foreignKey = associationEntityBuilder + var foreignKey = joinEntityBuilder .HasRelationship(typeof(Order), new[] { OrderProduct.OrderIdProperty }, ConfigurationSource.Convention) .IsUnique(false, ConfigurationSource.Convention) .Metadata; diff --git a/test/EFCore.Tests/Metadata/Conventions/ManyToManyAssociationEntityTypeConventionTest.cs b/test/EFCore.Tests/Metadata/Conventions/ManyToManyAssociationEntityTypeConventionTest.cs index b243c753b1b..e24ea598bc5 100644 --- a/test/EFCore.Tests/Metadata/Conventions/ManyToManyAssociationEntityTypeConventionTest.cs +++ b/test/EFCore.Tests/Metadata/Conventions/ManyToManyAssociationEntityTypeConventionTest.cs @@ -23,10 +23,10 @@ // ReSharper disable InconsistentNaming namespace Microsoft.EntityFrameworkCore.Metadata.Conventions { - public class ManyToManyAssociationEntityTypeConventionTest + public class ManyToManyJoinEntityTypeConventionTest { [ConditionalFact] - public void Association_entity_type_is_not_created_for_self_association() + public void Join_entity_type_is_not_created_for_self_join() { var modelBuilder = CreateInternalModeBuilder(); var manyToManySelf = modelBuilder.Entity(typeof(ManyToManySelf), ConfigurationSource.Convention); @@ -46,11 +46,11 @@ public void Association_entity_type_is_not_created_for_self_association() RunConvention(firstSkipNav); Assert.Empty(manyToManySelf.Metadata.Model.GetEntityTypes() - .Where(et => et.IsImplicitlyCreatedAssociationEntityType)); + .Where(et => et.IsImplicitlyCreatedJoinEntityType)); } [ConditionalFact] - public void Association_entity_type_is_not_created_when_no_inverse_skip_navigation() + public void Join_entity_type_is_not_created_when_no_inverse_skip_navigation() { var modelBuilder = CreateInternalModeBuilder(); var manyToManyFirst = modelBuilder.Entity(typeof(ManyToManyFirst), ConfigurationSource.Convention); @@ -73,11 +73,11 @@ public void Association_entity_type_is_not_created_when_no_inverse_skip_navigati RunConvention(skipNavOnFirst); Assert.Empty(manyToManyFirst.Metadata.Model.GetEntityTypes() - .Where(et => et.IsImplicitlyCreatedAssociationEntityType)); + .Where(et => et.IsImplicitlyCreatedJoinEntityType)); } [ConditionalFact] - public void Association_entity_type_is_not_created_when_skip_navigation_is_not_collection() + public void Join_entity_type_is_not_created_when_skip_navigation_is_not_collection() { var modelBuilder = CreateInternalModeBuilder(); var manyToManyFirst = modelBuilder.Entity(typeof(ManyToManyFirst), ConfigurationSource.Convention); @@ -101,11 +101,11 @@ public void Association_entity_type_is_not_created_when_skip_navigation_is_not_c RunConvention(skipNavOnFirst); Assert.Empty(manyToManyFirst.Metadata.Model.GetEntityTypes() - .Where(et => et.IsImplicitlyCreatedAssociationEntityType)); + .Where(et => et.IsImplicitlyCreatedJoinEntityType)); } [ConditionalFact] - public void Association_entity_type_is_not_created_when_inverse_skip_navigation_is_not_collection() + public void Join_entity_type_is_not_created_when_inverse_skip_navigation_is_not_collection() { var modelBuilder = CreateInternalModeBuilder(); var manyToManyFirst = modelBuilder.Entity(typeof(ManyToManyFirst), ConfigurationSource.Convention); @@ -129,11 +129,11 @@ public void Association_entity_type_is_not_created_when_inverse_skip_navigation_ RunConvention(skipNavOnFirst); Assert.Empty(manyToManyFirst.Metadata.Model.GetEntityTypes() - .Where(et => et.IsImplicitlyCreatedAssociationEntityType)); + .Where(et => et.IsImplicitlyCreatedJoinEntityType)); } [ConditionalFact] - public void Association_entity_type_is_not_created_when_skip_navigation_already_in_use() + public void Join_entity_type_is_not_created_when_skip_navigation_already_in_use() { var modelBuilder = CreateInternalModeBuilder(); var manyToManyFirst = modelBuilder.Entity(typeof(ManyToManyFirst), ConfigurationSource.Convention); @@ -164,11 +164,11 @@ public void Association_entity_type_is_not_created_when_skip_navigation_already_ RunConvention(skipNavOnFirst); Assert.Empty(manyToManyFirst.Metadata.Model.GetEntityTypes() - .Where(et => et.IsImplicitlyCreatedAssociationEntityType)); + .Where(et => et.IsImplicitlyCreatedJoinEntityType)); } [ConditionalFact] - public void Association_entity_type_is_not_created_when_inverse_skip_navigation_already_in_use() + public void Join_entity_type_is_not_created_when_inverse_skip_navigation_already_in_use() { var modelBuilder = CreateInternalModeBuilder(); var manyToManyFirst = modelBuilder.Entity(typeof(ManyToManyFirst), ConfigurationSource.Convention); @@ -199,11 +199,11 @@ public void Association_entity_type_is_not_created_when_inverse_skip_navigation_ RunConvention(skipNavOnFirst); Assert.Empty(manyToManyFirst.Metadata.Model.GetEntityTypes() - .Where(et => et.IsImplicitlyCreatedAssociationEntityType)); + .Where(et => et.IsImplicitlyCreatedJoinEntityType)); } [ConditionalFact] - public void Association_entity_type_is_created() + public void Join_entity_type_is_created() { var modelBuilder = CreateInternalModeBuilder(); var manyToManyFirst = modelBuilder.Entity(typeof(ManyToManyFirst), ConfigurationSource.Convention); @@ -225,7 +225,7 @@ public void Association_entity_type_is_created() RunConvention(skipNavOnFirst); var joinEntityType = manyToManyFirst.Metadata.Model.GetEntityTypes() - .Single(et => et.IsImplicitlyCreatedAssociationEntityType); + .Single(et => et.IsImplicitlyCreatedJoinEntityType); Assert.Equal("ManyToManyFirstManyToManySecond", joinEntityType.Name); @@ -275,8 +275,8 @@ private InternalSkipNavigationBuilder RunConvention(InternalSkipNavigationBuilde return context.ShouldStopProcessing() ? (InternalSkipNavigationBuilder)context.Result : skipNavBuilder; } - private ManyToManyAssociationEntityTypeConvention CreateManyToManyConvention() - => new ManyToManyAssociationEntityTypeConvention(CreateDependencies()); + private ManyToManyJoinEntityTypeConvention CreateManyToManyConvention() + => new ManyToManyJoinEntityTypeConvention(CreateDependencies()); private ProviderConventionSetBuilderDependencies CreateDependencies() => InMemoryTestHelpers.Instance.CreateContextServices().GetRequiredService() diff --git a/test/EFCore.Tests/Metadata/Conventions/RelationshipDiscoveryConventionTest.cs b/test/EFCore.Tests/Metadata/Conventions/RelationshipDiscoveryConventionTest.cs index 16072bbe022..341c34a7675 100644 --- a/test/EFCore.Tests/Metadata/Conventions/RelationshipDiscoveryConventionTest.cs +++ b/test/EFCore.Tests/Metadata/Conventions/RelationshipDiscoveryConventionTest.cs @@ -239,7 +239,7 @@ public void Many_to_one_bidirectional_is_discovered() } [ConditionalFact] - public void Many_to_many_skip_navigations_are_not_discovered_if_self_association() + public void Many_to_many_skip_navigations_are_not_discovered_if_self_join() { var modelBuilder = CreateInternalModeBuilder(); var manyToManySelf = modelBuilder.Entity(typeof(ManyToManySelf), ConfigurationSource.Convention); @@ -268,7 +268,7 @@ public void Many_to_many_skip_navigations_are_not_discovered_if_relationship_sho } [ConditionalFact] - public void Many_to_many_bidirectional_sets_up_skip_navigations_but_not_association_entity_type() + public void Many_to_many_bidirectional_sets_up_skip_navigations_but_not_join_entity_type() { var modelBuilder = CreateInternalModeBuilder(); var manyToManyFirst = modelBuilder.Entity(typeof(ManyToManyFirst), ConfigurationSource.Convention); @@ -287,7 +287,7 @@ public void Many_to_many_bidirectional_sets_up_skip_navigations_but_not_associat Assert.Same(navigationOnManyToManySecond.Inverse, navigationOnManyToManyFirst); Assert.Empty(manyToManyFirst.Metadata.Model.GetEntityTypes() - .Where(et => et.IsImplicitlyCreatedAssociationEntityType)); + .Where(et => et.IsImplicitlyCreatedJoinEntityType)); } [ConditionalFact] diff --git a/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs b/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs index 4bb8fe0b1f0..2c5b1a42c92 100644 --- a/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs +++ b/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs @@ -815,9 +815,9 @@ public void Removing_a_foreign_key_throws_if_referenced_from_skip_navigation() var firstId = firstEntity.AddProperty(Order.IdProperty); var firstKey = firstEntity.AddKey(firstId); var secondEntity = model.AddEntityType(typeof(Product)); - var associationEntity = model.AddEntityType(typeof(OrderProduct)); - var orderIdProperty = associationEntity.AddProperty(OrderProduct.OrderIdProperty); - var foreignKey = associationEntity + var joinEntity = model.AddEntityType(typeof(OrderProduct)); + var orderIdProperty = joinEntity.AddProperty(OrderProduct.OrderIdProperty); + var foreignKey = joinEntity .AddForeignKey(new[] { orderIdProperty }, firstKey, firstEntity); var navigation = firstEntity.AddSkipNavigation( @@ -826,7 +826,7 @@ public void Removing_a_foreign_key_throws_if_referenced_from_skip_navigation() Assert.Equal(CoreStrings.ForeignKeyInUseSkipNavigation( "{'" + nameof(OrderProduct.OrderId) + "'}", nameof(OrderProduct), nameof(Order.Products), nameof(Order)), - Assert.Throws(() => associationEntity.RemoveForeignKey(foreignKey)).Message); + Assert.Throws(() => joinEntity.RemoveForeignKey(foreignKey)).Message); } [ConditionalFact] diff --git a/test/EFCore.Tests/Metadata/Internal/InternalModelBuilderTest.cs b/test/EFCore.Tests/Metadata/Internal/InternalModelBuilderTest.cs index eb444c1c398..e8614058c35 100644 --- a/test/EFCore.Tests/Metadata/Internal/InternalModelBuilderTest.cs +++ b/test/EFCore.Tests/Metadata/Internal/InternalModelBuilderTest.cs @@ -351,7 +351,7 @@ public void Can_mark_type_as_owned_type() [ConditionalTheory] [InlineData(true)] [InlineData(false)] - public void Can_remove_implicitly_created_association_entity_type(bool removeSkipNavs) + public void Can_remove_implicitly_created_join_entity_type(bool removeSkipNavs) { var model = new Model(); var modelBuilder = CreateModelBuilder(model); @@ -371,12 +371,12 @@ public void Can_remove_implicitly_created_association_entity_type(bool removeSki ConfigurationSource.Convention); skipNavOnLeft.HasInverse(skipNavOnRight.Metadata, ConfigurationSource.Convention); - var associationEntityTypeBuilder = + var joinEntityTypeBuilder = model.AddEntityType( - "AssociationEntity", + "JoinEntity", typeof(Dictionary), ConfigurationSource.Convention).Builder; - var leftFK = associationEntityTypeBuilder + var leftFK = joinEntityTypeBuilder .HasRelationship( manyToManyLeft.Metadata.Name, new List() { "ManyToManyLeft_Id" }, @@ -384,7 +384,7 @@ public void Can_remove_implicitly_created_association_entity_type(bool removeSki ConfigurationSource.Convention) .IsUnique(false, ConfigurationSource.Convention) .Metadata; - var rightFK = associationEntityTypeBuilder + var rightFK = joinEntityTypeBuilder .HasRelationship( manyToManyRight.Metadata.Name, new List() { "ManyToManyRight_Id" }, @@ -394,19 +394,19 @@ public void Can_remove_implicitly_created_association_entity_type(bool removeSki .Metadata; skipNavOnLeft.HasForeignKey(leftFK, ConfigurationSource.Convention); skipNavOnRight.HasForeignKey(rightFK, ConfigurationSource.Convention); - associationEntityTypeBuilder.PrimaryKey( + joinEntityTypeBuilder.PrimaryKey( leftFK.Properties.Concat(rightFK.Properties).ToList(), ConfigurationSource.Convention); - var associationEntityType = associationEntityTypeBuilder.Metadata; + var joinEntityType = joinEntityTypeBuilder.Metadata; - Assert.NotNull(associationEntityType); + Assert.NotNull(joinEntityType); - Assert.NotNull(modelBuilder.RemoveAssociationEntityIfCreatedImplicitly( - associationEntityType, removeSkipNavs, ConfigurationSource.Convention)); + Assert.NotNull(modelBuilder.RemoveJoinEntityIfCreatedImplicitly( + joinEntityType, removeSkipNavs, ConfigurationSource.Convention)); Assert.Empty(model.GetEntityTypes() - .Where(e => e.IsImplicitlyCreatedAssociationEntityType)); + .Where(e => e.IsImplicitlyCreatedJoinEntityType)); var leftSkipNav = manyToManyLeft.Metadata.FindDeclaredSkipNavigation(nameof(ManyToManyLeft.Rights)); var rightSkipNav = manyToManyRight.Metadata.FindDeclaredSkipNavigation(nameof(ManyToManyRight.Lefts)); @@ -425,7 +425,7 @@ public void Can_remove_implicitly_created_association_entity_type(bool removeSki [ConditionalTheory] [InlineData(true)] [InlineData(false)] - public void Cannot_remove_manually_created_association_entity_type(bool removeSkipNavs) + public void Cannot_remove_manually_created_join_entity_type(bool removeSkipNavs) { var model = new Model(); var modelBuilder = CreateModelBuilder(model); @@ -461,20 +461,20 @@ public void Cannot_remove_manually_created_association_entity_type(bool removeSk skipNavOnRight.Metadata.SetForeignKey(rightFK.Metadata, ConfigurationSource.Convention); skipNavOnLeft.HasInverse(skipNavOnRight.Metadata, ConfigurationSource.Convention); - var associationEntityType = skipNavOnLeft.Metadata.AssociationEntityType; - Assert.NotNull(associationEntityType); - Assert.Same(associationEntityType, skipNavOnRight.Metadata.AssociationEntityType); + var joinEntityType = skipNavOnLeft.Metadata.JoinEntityType; + Assert.NotNull(joinEntityType); + Assert.Same(joinEntityType, skipNavOnRight.Metadata.JoinEntityType); - Assert.Null(modelBuilder.RemoveAssociationEntityIfCreatedImplicitly( - associationEntityType, removeSkipNavs, ConfigurationSource.Convention)); + Assert.Null(modelBuilder.RemoveJoinEntityIfCreatedImplicitly( + joinEntityType, removeSkipNavs, ConfigurationSource.Convention)); var leftSkipNav = manyToManyLeft.Metadata.FindDeclaredSkipNavigation(nameof(ManyToManyLeft.Rights)); var rightSkipNav = manyToManyRight.Metadata.FindDeclaredSkipNavigation(nameof(ManyToManyRight.Lefts)); Assert.NotNull(leftSkipNav); Assert.NotNull(rightSkipNav); - Assert.Same(leftSkipNav.AssociationEntityType, rightSkipNav.AssociationEntityType); - Assert.Same(manyToManyJoin.Metadata, leftSkipNav.AssociationEntityType); + Assert.Same(leftSkipNav.JoinEntityType, rightSkipNav.JoinEntityType); + Assert.Same(manyToManyJoin.Metadata, leftSkipNav.JoinEntityType); } [ConditionalFact] diff --git a/test/EFCore.Tests/Metadata/Internal/InternalSkipNavigationBuilderTest.cs b/test/EFCore.Tests/Metadata/Internal/InternalSkipNavigationBuilderTest.cs index 554bae98d5e..821953259ea 100644 --- a/test/EFCore.Tests/Metadata/Internal/InternalSkipNavigationBuilderTest.cs +++ b/test/EFCore.Tests/Metadata/Internal/InternalSkipNavigationBuilderTest.cs @@ -126,7 +126,7 @@ 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 + // the skip navigation is pointing to the automatically-generated join entity type var originalFK = metadata.ForeignKey; Assert.NotNull(originalFK); Assert.Equal(ConfigurationSource.Convention, metadata.GetForeignKeyConfigurationSource()); @@ -171,7 +171,7 @@ public void Can_only_override_lower_or_equal_source_Inverse() IConventionSkipNavigation metadata = builder.Metadata; // the skip navigation is pointing to the automatically-generated - // association entity type and so is its inverse + // join entity type and so is its inverse var inverse = (SkipNavigation)metadata.TargetEntityType.Builder.HasSkipNavigation( Product.OrdersProperty, metadata.DeclaringEntityType) diff --git a/test/EFCore.Tests/Metadata/Internal/SkipNavigationTest.cs b/test/EFCore.Tests/Metadata/Internal/SkipNavigationTest.cs index cdea7816960..e5de3e6a099 100644 --- a/test/EFCore.Tests/Metadata/Internal/SkipNavigationTest.cs +++ b/test/EFCore.Tests/Metadata/Internal/SkipNavigationTest.cs @@ -19,9 +19,9 @@ public void Gets_expected_default_values() var firstIdProperty = firstEntity.AddProperty(Order.IdProperty); var firstKey = firstEntity.AddKey(firstIdProperty); var secondEntity = model.AddEntityType(typeof(Product)); - var associationEntityBuilder = model.AddEntityType(typeof(OrderProduct)); - var orderIdProperty = associationEntityBuilder.AddProperty(OrderProduct.OrderIdProperty); - var firstFk = associationEntityBuilder + var joinEntityBuilder = model.AddEntityType(typeof(OrderProduct)); + var orderIdProperty = joinEntityBuilder.AddProperty(OrderProduct.OrderIdProperty); + var firstFk = joinEntityBuilder .AddForeignKey(new[] { orderIdProperty }, firstKey, firstEntity); var navigation = firstEntity.AddSkipNavigation(nameof(Order.Products), null, secondEntity, true, false); @@ -48,9 +48,9 @@ public void Can_set_foreign_key() var firstIdProperty = firstEntity.AddProperty(Order.IdProperty); var firstKey = firstEntity.AddKey(firstIdProperty); var secondEntity = model.AddEntityType(typeof(Product)); - var associationEntityBuilder = model.AddEntityType(typeof(OrderProduct)); - var orderIdProperty = associationEntityBuilder.AddProperty(OrderProduct.OrderIdProperty); - var firstFk = associationEntityBuilder + var joinEntityBuilder = model.AddEntityType(typeof(OrderProduct)); + var orderIdProperty = joinEntityBuilder.AddProperty(OrderProduct.OrderIdProperty); + var firstFk = joinEntityBuilder .AddForeignKey(new[] { orderIdProperty }, firstKey, firstEntity); var navigation = firstEntity.AddSkipNavigation(nameof(Order.Products), null, secondEntity, true, false); @@ -217,7 +217,7 @@ public void Setting_inverse_targetting_wrong_type_throws() } [ConditionalFact] - public void Setting_inverse_with_wrong_association_type_throws() + public void Setting_inverse_with_wrong_join_type_throws() { var model = CreateModel(); var orderEntity = model.AddEntityType(typeof(Order)); @@ -240,7 +240,7 @@ public void Setting_inverse_with_wrong_association_type_throws() var ordersNavigation = productEntity.AddSkipNavigation(nameof(Product.Orders), null, orderEntity, true, false); ordersNavigation.SetForeignKey(productOrderForeignKey); - Assert.Equal(CoreStrings.SkipInverseMismatchedAssociationType( + Assert.Equal(CoreStrings.SkipInverseMismatchedJoinType( nameof(Product.Orders), nameof(Product), nameof(Order.Products), nameof(OrderProduct)), Assert.Throws(() => productsNavigation.SetInverse(ordersNavigation)).Message); } diff --git a/test/EFCore.Tests/ModelBuilding/ManyToManyTestBase.cs b/test/EFCore.Tests/ModelBuilding/ManyToManyTestBase.cs index 7862a5eb539..cd94ff0874c 100644 --- a/test/EFCore.Tests/ModelBuilding/ManyToManyTestBase.cs +++ b/test/EFCore.Tests/ModelBuilding/ManyToManyTestBase.cs @@ -125,7 +125,7 @@ public virtual void Finds_existing_navigations_and_uses_associated_FK_with_field } [ConditionalFact] - public virtual void Association_type_is_automatically_configured_by_convention() + public virtual void Join_type_is_automatically_configured_by_convention() { var modelBuilder = CreateModelBuilder(); var model = modelBuilder.Model; @@ -135,7 +135,7 @@ public virtual void Association_type_is_automatically_configured_by_convention() var manyToManyA = model.FindEntityType(typeof(ImplicitManyToManyA)); var manyToManyB = model.FindEntityType(typeof(ImplicitManyToManyB)); var joinEntityType = model.GetEntityTypes() - .Where(et => ((EntityType)et).IsImplicitlyCreatedAssociationEntityType) + .Where(et => ((EntityType)et).IsImplicitlyCreatedJoinEntityType) .Single(); Assert.Equal("ImplicitManyToManyAImplicitManyToManyB", joinEntityType.Name); @@ -165,7 +165,7 @@ public virtual void Association_type_is_automatically_configured_by_convention() } [ConditionalFact] - public virtual void Association_type_is_not_automatically_configured_when_navigations_are_ambiguous() + public virtual void Join_type_is_not_automatically_configured_when_navigations_are_ambiguous() { var modelBuilder = CreateModelBuilder(); var model = modelBuilder.Model; @@ -177,14 +177,14 @@ public virtual void Association_type_is_not_automatically_configured_when_naviga Assert.NotNull(hob); Assert.NotNull(nob); Assert.Empty(model.GetEntityTypes() - .Where(et => ((EntityType)et).IsImplicitlyCreatedAssociationEntityType)); + .Where(et => ((EntityType)et).IsImplicitlyCreatedJoinEntityType)); Assert.Empty(hob.GetSkipNavigations()); Assert.Empty(nob.GetSkipNavigations()); } [ConditionalFact] - public virtual void Can_configure_association_type_using_fluent_api() + public virtual void Can_configure_join_type_using_fluent_api() { var modelBuilder = CreateModelBuilder(); var model = modelBuilder.Model; @@ -426,7 +426,7 @@ public virtual void UsingEntity_with_shared_type_passed_when_marked_as_shared_ty modelBuilder.SharedEntity("Shared"); - var associationEntityType = modelBuilder.Entity() + var joinEntityType = modelBuilder.Entity() .HasMany(e => e.Dependents) .WithMany(e => e.ManyToManyPrincipals) .UsingEntity( @@ -434,9 +434,9 @@ public virtual void UsingEntity_with_shared_type_passed_when_marked_as_shared_ty r => r.HasOne().WithMany(), l => l.HasOne().WithMany()).Metadata; - Assert.True(associationEntityType.HasSharedClrType); - Assert.Equal("Shared", associationEntityType.Name); - Assert.Equal(typeof(ManyToManyJoinWithFields), associationEntityType.ClrType); + Assert.True(joinEntityType.HasSharedClrType); + Assert.Equal("Shared", joinEntityType.Name); + Assert.Equal(typeof(ManyToManyJoinWithFields), joinEntityType.ClrType); } [ConditionalFact] @@ -446,7 +446,7 @@ public virtual void UsingEntity_with_shared_type_passes_when_configured_as_share modelBuilder.SharedEntity("Shared"); - var associationEntityType = modelBuilder.Entity() + var joinEntityType = modelBuilder.Entity() .HasMany(e => e.Dependents) .WithMany(e => e.ManyToManyPrincipals) .UsingEntity( @@ -454,9 +454,9 @@ public virtual void UsingEntity_with_shared_type_passes_when_configured_as_share r => r.HasOne().WithMany(), l => l.HasOne().WithMany()).Metadata; - Assert.True(associationEntityType.HasSharedClrType); - Assert.Equal("Shared", associationEntityType.Name); - Assert.Equal(typeof(ManyToManyJoinWithFields), associationEntityType.ClrType); + Assert.True(joinEntityType.HasSharedClrType); + Assert.Equal("Shared", joinEntityType.Name); + Assert.Equal(typeof(ManyToManyJoinWithFields), joinEntityType.ClrType); } } } diff --git a/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs b/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs index c9d66b82ba9..cc7c69a1661 100644 --- a/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs +++ b/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs @@ -653,59 +653,59 @@ public GenericTestCollectionCollectionBuilder(CollectionCollectionBuilder CollectionCollectionBuilder { get; } - public override TestEntityTypeBuilder UsingEntity( - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft) - => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( - l => ((GenericTestReferenceCollectionBuilder)configureRight( - new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((GenericTestReferenceCollectionBuilder)configureLeft( - new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); - - public override TestEntityTypeBuilder UsingEntity( + public override TestEntityTypeBuilder UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft) + => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( + l => ((GenericTestReferenceCollectionBuilder)configureRight( + new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((GenericTestReferenceCollectionBuilder)configureLeft( + new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); + + public override TestEntityTypeBuilder UsingEntity( string joinEntityName, - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft) - => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft) + => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( joinEntityName, - l => ((GenericTestReferenceCollectionBuilder)configureRight( - new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((GenericTestReferenceCollectionBuilder)configureLeft( - new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); - - public override TestEntityTypeBuilder UsingEntity( - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft, - Action> configureAssociation) - where TAssociationEntity : class - => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( - l => ((GenericTestReferenceCollectionBuilder)configureRight( - new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((GenericTestReferenceCollectionBuilder)configureLeft( - new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, - e => configureAssociation(new GenericTestEntityTypeBuilder(e)))); - - public override TestEntityTypeBuilder UsingEntity( + l => ((GenericTestReferenceCollectionBuilder)configureRight( + new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((GenericTestReferenceCollectionBuilder)configureLeft( + new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); + + public override TestEntityTypeBuilder UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft, + Action> configureJoin) + where TJoinEntity : class + => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( + l => ((GenericTestReferenceCollectionBuilder)configureRight( + new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((GenericTestReferenceCollectionBuilder)configureLeft( + new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, + e => configureJoin(new GenericTestEntityTypeBuilder(e)))); + + public override TestEntityTypeBuilder UsingEntity( string joinEntityName, - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft, - Action> configureAssociation) - where TAssociationEntity : class - => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft, + Action> configureJoin) + where TJoinEntity : class + => new GenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( joinEntityName, - l => ((GenericTestReferenceCollectionBuilder)configureRight( - new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((GenericTestReferenceCollectionBuilder)configureLeft( - new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, - e => configureAssociation(new GenericTestEntityTypeBuilder(e)))); + l => ((GenericTestReferenceCollectionBuilder)configureRight( + new GenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((GenericTestReferenceCollectionBuilder)configureLeft( + new GenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, + e => configureJoin(new GenericTestEntityTypeBuilder(e)))); } protected class GenericTestOwnershipBuilder diff --git a/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs b/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs index a1fb696af1b..dfea139839a 100644 --- a/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs +++ b/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs @@ -646,63 +646,63 @@ public NonGenericTestCollectionCollectionBuilder(CollectionCollectionBuilder col protected CollectionCollectionBuilder CollectionCollectionBuilder { get; } - public override TestEntityTypeBuilder UsingEntity( - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft) - => new NonGenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( - typeof(TAssociationEntity), - l => ((NonGenericTestReferenceCollectionBuilder)configureRight( - new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( - new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); - - public override TestEntityTypeBuilder UsingEntity( + public override TestEntityTypeBuilder UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft) + => new NonGenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( + typeof(TJoinEntity), + l => ((NonGenericTestReferenceCollectionBuilder)configureRight( + new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( + new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); + + public override TestEntityTypeBuilder UsingEntity( string joinEntityName, - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft) - => new NonGenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft) + => new NonGenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( joinEntityName, - typeof(TAssociationEntity), - l => ((NonGenericTestReferenceCollectionBuilder)configureRight( - new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( - new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); - - public override TestEntityTypeBuilder UsingEntity( - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft, - Action> configureAssociation) - where TAssociationEntity : class + typeof(TJoinEntity), + l => ((NonGenericTestReferenceCollectionBuilder)configureRight( + new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( + new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder)); + + public override TestEntityTypeBuilder UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft, + Action> configureJoin) + where TJoinEntity : class => new NonGenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( - typeof(TAssociationEntity), - l => ((NonGenericTestReferenceCollectionBuilder)configureRight( - new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( - new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, - e => configureAssociation(new NonGenericTestEntityTypeBuilder(e)))); - - public override TestEntityTypeBuilder UsingEntity( + typeof(TJoinEntity), + l => ((NonGenericTestReferenceCollectionBuilder)configureRight( + new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( + new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, + e => configureJoin(new NonGenericTestEntityTypeBuilder(e)))); + + public override TestEntityTypeBuilder UsingEntity( string joinEntityName, - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft, - Action> configureAssociation) - where TAssociationEntity : class + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft, + Action> configureJoin) + where TJoinEntity : class => new NonGenericTestEntityTypeBuilder(CollectionCollectionBuilder.UsingEntity( joinEntityName, - typeof(TAssociationEntity), - l => ((NonGenericTestReferenceCollectionBuilder)configureRight( - new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, - r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( - new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, - e => configureAssociation(new NonGenericTestEntityTypeBuilder(e)))); + typeof(TJoinEntity), + l => ((NonGenericTestReferenceCollectionBuilder)configureRight( + new NonGenericTestEntityTypeBuilder(l))).ReferenceCollectionBuilder, + r => ((NonGenericTestReferenceCollectionBuilder)configureLeft( + new NonGenericTestEntityTypeBuilder(r))).ReferenceCollectionBuilder, + e => configureJoin(new NonGenericTestEntityTypeBuilder(e)))); } protected class NonGenericTestOwnershipBuilder diff --git a/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs b/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs index 6824aaa2ea9..87aa5111343 100644 --- a/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs +++ b/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs @@ -447,37 +447,37 @@ public abstract class TestCollectionCollectionBuilder where TLeftEntity : class where TRightEntity : class { - public abstract TestEntityTypeBuilder UsingEntity( - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft) - where TAssociationEntity : class; - - public abstract TestEntityTypeBuilder UsingEntity( + public abstract TestEntityTypeBuilder UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft) + where TJoinEntity : class; + + public abstract TestEntityTypeBuilder UsingEntity( string joinEntityName, - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft) - where TAssociationEntity : class; - - public abstract TestEntityTypeBuilder UsingEntity( - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft, - Action> configureAssociation) - where TAssociationEntity : class; - - public abstract TestEntityTypeBuilder UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft) + where TJoinEntity : class; + + public abstract TestEntityTypeBuilder UsingEntity( + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft, + Action> configureJoin) + where TJoinEntity : class; + + public abstract TestEntityTypeBuilder UsingEntity( string joinEntityName, - Func, - TestReferenceCollectionBuilder> configureRight, - Func, - TestReferenceCollectionBuilder> configureLeft, - Action> configureAssociation) - where TAssociationEntity : class; + Func, + TestReferenceCollectionBuilder> configureRight, + Func, + TestReferenceCollectionBuilder> configureLeft, + Action> configureJoin) + where TJoinEntity : class; } public abstract class TestOwnershipBuilder