From 3b64a544be5987e71d2ec560234fee32bd60a213 Mon Sep 17 00:00:00 2001 From: lajones Date: Fri, 3 Apr 2020 15:14:00 -0700 Subject: [PATCH] Use the generic IndexBuilder. --- .../Metadata/Builders/EntityTypeBuilder`.cs | 18 ++++++++-- .../Builders/OwnedNavigationBuilder`.cs | 15 ++++++-- .../RelationalTestModelBuilderExtensions.cs | 32 ++++++++++++----- .../SqlServerTestModelBuilderExtensions.cs | 16 ++++++--- .../ModelBuilding/ModelBuilderGenericTest.cs | 35 ++++++++++++++----- .../ModelBuilderNonGenericTest.cs | 35 ++++++++++++++----- .../ModelBuilding/ModelBuilderTestBase.cs | 27 +++++--------- 7 files changed, 127 insertions(+), 51 deletions(-) diff --git a/src/EFCore/Metadata/Builders/EntityTypeBuilder`.cs b/src/EFCore/Metadata/Builders/EntityTypeBuilder`.cs index 1fa0f0ce634..fe15fbcbb43 100644 --- a/src/EFCore/Metadata/Builders/EntityTypeBuilder`.cs +++ b/src/EFCore/Metadata/Builders/EntityTypeBuilder`.cs @@ -103,7 +103,8 @@ public virtual KeyBuilder HasKey([NotNull] Expression /// Creates an alternate key in the model for this entity type if one does not already exist over the specified - /// properties. This will force the properties to be read-only. Use to specify uniqueness + /// properties. This will force the properties to be read-only. Use or + /// to specify uniqueness /// in the model that does not force properties to be read-only. /// /// @@ -124,7 +125,8 @@ public virtual KeyBuilder HasAlternateKey([NotNull] Expression /// Creates an alternate key in the model for this entity type if one does not already exist over the specified - /// properties. This will force the properties to be read-only. Use to specify uniqueness + /// properties. This will force the properties to be read-only. Use or + /// to specify uniqueness /// in the model that does not force properties to be read-only. /// /// The names of the properties that make up the key. @@ -234,6 +236,18 @@ public virtual IndexBuilder HasIndex([NotNull] Expression + /// Configures an index on the specified properties. If there is an existing index on the given + /// set of properties, then the existing index will be returned for configuration. + /// + /// The names of the properties that make up the index. + /// An object that can be used to configure the index. + public new virtual IndexBuilder HasIndex([NotNull] params string[] propertyNames) + => new IndexBuilder( + Builder.HasIndex( + Check.NotEmpty(propertyNames, nameof(propertyNames)), + ConfigurationSource.Explicit).Metadata); + /// /// /// Configures a relationship where the target entity is owned by (or part of) this entity. diff --git a/src/EFCore/Metadata/Builders/OwnedNavigationBuilder`.cs b/src/EFCore/Metadata/Builders/OwnedNavigationBuilder`.cs index 300fe68989b..42b0b024f03 100644 --- a/src/EFCore/Metadata/Builders/OwnedNavigationBuilder`.cs +++ b/src/EFCore/Metadata/Builders/OwnedNavigationBuilder`.cs @@ -156,12 +156,23 @@ public virtual OwnedNavigationBuilder Ignore( /// /// /// An object that can be used to configure the index. - public virtual IndexBuilder HasIndex([NotNull] Expression> indexExpression) - => new IndexBuilder( + public virtual IndexBuilder HasIndex([NotNull] Expression> indexExpression) + => new IndexBuilder( DependentEntityType.Builder.HasIndex( Check.NotNull(indexExpression, nameof(indexExpression)).GetPropertyAccessList(), ConfigurationSource.Explicit) .Metadata); + /// + /// Configures an index on the specified properties. If there is an existing index on the given + /// set of properties, then the existing index will be returned for configuration. + /// + /// The names of the properties that make up the index. + /// An object that can be used to configure the index. + public new virtual IndexBuilder HasIndex([NotNull] params string[] propertyNames) + => new IndexBuilder( + DependentEntityType.Builder.HasIndex( + Check.NotEmpty(propertyNames, nameof(propertyNames)), ConfigurationSource.Explicit).Metadata); + /// /// /// Configures the relationship to the owner. diff --git a/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs b/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs index 44512ce978a..0eed8d5eb25 100644 --- a/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs +++ b/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs @@ -231,19 +231,35 @@ public static ModelBuilderTest.TestReferenceCollectionBuilder HasFilter( + this ModelBuilderTest.TestIndexBuilder builder, string filterExpression) { - var indexBuilder = builder.GetInfrastructure(); - indexBuilder.HasFilter(filterExpression); + switch (builder) + { + case IInfrastructure> genericBuilder: + genericBuilder.Instance.HasFilter(filterExpression); + break; + case IInfrastructure nongenericBuilder: + nongenericBuilder.Instance.HasFilter(filterExpression); + break; + } + return builder; } - public static ModelBuilderTest.TestIndexBuilder HasName( - this ModelBuilderTest.TestIndexBuilder builder, string name) + public static ModelBuilderTest.TestIndexBuilder HasName( + this ModelBuilderTest.TestIndexBuilder builder, string name) { - var indexBuilder = builder.GetInfrastructure(); - indexBuilder.HasName(name); + switch (builder) + { + case IInfrastructure> genericBuilder: + genericBuilder.Instance.HasName(name); + break; + case IInfrastructure nongenericBuilder: + nongenericBuilder.Instance.HasName(name); + break; + } + return builder; } diff --git a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs index 99b24a2a48d..e7ebabce531 100644 --- a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs +++ b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs @@ -8,11 +8,19 @@ namespace Microsoft.EntityFrameworkCore.ModelBuilding { public static class SqlServerTestModelBuilderExtensions { - public static ModelBuilderTest.TestIndexBuilder IsClustered( - this ModelBuilderTest.TestIndexBuilder builder, bool clustered = true) + public static ModelBuilderTest.TestIndexBuilder IsClustered( + this ModelBuilderTest.TestIndexBuilder builder, bool clustered = true) { - var indexBuilder = builder.GetInfrastructure(); - indexBuilder.IsClustered(clustered); + switch (builder) + { + case IInfrastructure> genericBuilder: + genericBuilder.Instance.IsClustered(clustered); + break; + case IInfrastructure nongenericBuilder: + nongenericBuilder.Instance.IsClustered(clustered); + break; + } + return builder; } diff --git a/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs b/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs index 2af3faea903..42c6e2111a5 100644 --- a/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs +++ b/test/EFCore.Tests/ModelBuilding/ModelBuilderGenericTest.cs @@ -217,11 +217,11 @@ public override TestEntityTypeBuilder Ignore(Expression Ignore(string propertyName) => Wrap(EntityTypeBuilder.Ignore(propertyName)); - public override TestIndexBuilder HasIndex(Expression> indexExpression) - => new TestIndexBuilder(EntityTypeBuilder.HasIndex(indexExpression)); + public override TestIndexBuilder HasIndex(Expression> indexExpression) + => new GenericTestIndexBuilder(EntityTypeBuilder.HasIndex(indexExpression)); - public override TestIndexBuilder HasIndex(params string[] propertyNames) - => new TestIndexBuilder(EntityTypeBuilder.HasIndex(propertyNames)); + public override TestIndexBuilder HasIndex(params string[] propertyNames) + => new GenericTestIndexBuilder(EntityTypeBuilder.HasIndex(propertyNames)); public override TestOwnedNavigationBuilder OwnsOne(string navigationName) => new GenericTestOwnedNavigationBuilder(EntityTypeBuilder.OwnsOne(navigationName)); @@ -458,6 +458,25 @@ public override TestKeyBuilder HasAnnotation(string annotation, object KeyBuilder IInfrastructure>.Instance => KeyBuilder; } + public class GenericTestIndexBuilder : TestIndexBuilder, IInfrastructure> + { + public GenericTestIndexBuilder(IndexBuilder indexBuilder) + { + IndexBuilder = indexBuilder; + } + + private IndexBuilder IndexBuilder { get; } + public override IMutableIndex Metadata => IndexBuilder.Metadata; + + public override TestIndexBuilder HasAnnotation(string annotation, object value) + => new GenericTestIndexBuilder(IndexBuilder.HasAnnotation(annotation, value)); + + public override TestIndexBuilder IsUnique(bool isUnique = true) + => new GenericTestIndexBuilder(IndexBuilder.IsUnique(isUnique)); + + IndexBuilder IInfrastructure>.Instance => IndexBuilder; + } + protected class GenericTestNavigationBuilder : TestNavigationBuilder { public GenericTestNavigationBuilder(NavigationBuilder navigationBuilder) @@ -759,11 +778,11 @@ public override TestOwnedNavigationBuilder Ignore( Expression> propertyExpression) => Wrap(OwnedNavigationBuilder.Ignore(propertyExpression)); - public override TestIndexBuilder HasIndex(params string[] propertyNames) - => new TestIndexBuilder(OwnedNavigationBuilder.HasIndex(propertyNames)); + public override TestIndexBuilder HasIndex(params string[] propertyNames) + => new GenericTestIndexBuilder(OwnedNavigationBuilder.HasIndex(propertyNames)); - public override TestIndexBuilder HasIndex(Expression> indexExpression) - => new TestIndexBuilder(OwnedNavigationBuilder.HasIndex(indexExpression)); + public override TestIndexBuilder HasIndex(Expression> indexExpression) + => new GenericTestIndexBuilder(OwnedNavigationBuilder.HasIndex(indexExpression)); public override TestOwnershipBuilder WithOwner(string ownerReference) => new GenericTestOwnershipBuilder( diff --git a/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs b/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs index 15a80b862a8..e7227f57446 100644 --- a/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs +++ b/test/EFCore.Tests/ModelBuilding/ModelBuilderNonGenericTest.cs @@ -163,12 +163,12 @@ public override TestEntityTypeBuilder Ignore(Expression Ignore(string propertyName) => Wrap(EntityTypeBuilder.Ignore(propertyName)); - public override TestIndexBuilder HasIndex(Expression> indexExpression) - => new TestIndexBuilder( + public override TestIndexBuilder HasIndex(Expression> indexExpression) + => new NonGenericTestIndexBuilder( EntityTypeBuilder.HasIndex(indexExpression.GetPropertyAccessList().Select(p => p.GetSimpleMemberName()).ToArray())); - public override TestIndexBuilder HasIndex(params string[] propertyNames) - => new TestIndexBuilder(EntityTypeBuilder.HasIndex(propertyNames)); + public override TestIndexBuilder HasIndex(params string[] propertyNames) + => new NonGenericTestIndexBuilder(EntityTypeBuilder.HasIndex(propertyNames)); public override TestOwnedNavigationBuilder OwnsOne(string navigationName) => new NonGenericTestOwnedNavigationBuilder( @@ -446,6 +446,25 @@ public override TestKeyBuilder HasAnnotation(string annotation, object KeyBuilder IInfrastructure.Instance => KeyBuilder; } + public class NonGenericTestIndexBuilder : TestIndexBuilder, IInfrastructure + { + public NonGenericTestIndexBuilder(IndexBuilder indexBuilder) + { + IndexBuilder = indexBuilder; + } + + private IndexBuilder IndexBuilder { get; } + public override IMutableIndex Metadata => IndexBuilder.Metadata; + + public override TestIndexBuilder HasAnnotation(string annotation, object value) + => new NonGenericTestIndexBuilder(IndexBuilder.HasAnnotation(annotation, value)); + + public override TestIndexBuilder IsUnique(bool isUnique = true) + => new NonGenericTestIndexBuilder(IndexBuilder.IsUnique(isUnique)); + + IndexBuilder IInfrastructure.Instance => IndexBuilder; + } + protected class NonGenericTestReferenceNavigationBuilder : TestReferenceNavigationBuilder where TEntity : class @@ -754,11 +773,11 @@ public override TestOwnedNavigationBuilder Ignore( => Wrap( OwnedNavigationBuilder.Ignore(propertyExpression.GetPropertyAccess().GetSimpleMemberName())); - public override TestIndexBuilder HasIndex(params string[] propertyNames) - => new TestIndexBuilder(OwnedNavigationBuilder.HasIndex(propertyNames)); + public override TestIndexBuilder HasIndex(params string[] propertyNames) + => new NonGenericTestIndexBuilder(OwnedNavigationBuilder.HasIndex(propertyNames)); - public override TestIndexBuilder HasIndex(Expression> indexExpression) - => new TestIndexBuilder( + public override TestIndexBuilder HasIndex(Expression> indexExpression) + => new NonGenericTestIndexBuilder( OwnedNavigationBuilder.HasIndex( indexExpression.GetPropertyAccessList().Select(p => p.GetSimpleMemberName()).ToArray())); diff --git a/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs b/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs index 9c51910ac41..b8b20b5ccf8 100644 --- a/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs +++ b/test/EFCore.Tests/ModelBuilding/ModelBuilderTestBase.cs @@ -203,8 +203,8 @@ public abstract TestEntityTypeBuilder Ignore( public abstract TestEntityTypeBuilder Ignore(string propertyName); - public abstract TestIndexBuilder HasIndex(Expression> indexExpression); - public abstract TestIndexBuilder HasIndex(params string[] propertyNames); + public abstract TestIndexBuilder HasIndex(Expression> indexExpression); + public abstract TestIndexBuilder HasIndex(params string[] propertyNames); public abstract TestOwnedNavigationBuilder OwnsOne(string navigationName) where TRelatedEntity : class; @@ -301,23 +301,12 @@ public abstract class TestKeyBuilder public abstract TestKeyBuilder HasAnnotation(string annotation, object value); } - public class TestIndexBuilder : IInfrastructure + public abstract class TestIndexBuilder { - public TestIndexBuilder(IndexBuilder indexBuilder) - { - IndexBuilder = indexBuilder; - } - - private IndexBuilder IndexBuilder { get; } - public IMutableIndex Metadata => IndexBuilder.Metadata; - - public virtual TestIndexBuilder HasAnnotation(string annotation, object value) - => new TestIndexBuilder(IndexBuilder.HasAnnotation(annotation, value)); - - public virtual TestIndexBuilder IsUnique(bool isUnique = true) - => new TestIndexBuilder(IndexBuilder.IsUnique(isUnique)); + public abstract IMutableIndex Metadata { get; } - IndexBuilder IInfrastructure.Instance => IndexBuilder; + public abstract TestIndexBuilder HasAnnotation(string annotation, object value); + public abstract TestIndexBuilder IsUnique(bool isUnique = true); } public abstract class TestPropertyBuilder @@ -517,8 +506,8 @@ public abstract TestNavigationBuilder Navigation( public abstract TestOwnedNavigationBuilder Ignore( Expression> propertyExpression); - public abstract TestIndexBuilder HasIndex(params string[] propertyNames); - public abstract TestIndexBuilder HasIndex(Expression> indexExpression); + public abstract TestIndexBuilder HasIndex(params string[] propertyNames); + public abstract TestIndexBuilder HasIndex(Expression> indexExpression); public abstract TestOwnershipBuilder WithOwner(string ownerReference); public abstract TestOwnershipBuilder WithOwner(