diff --git a/src/EFCore.Relational/Extensions/RelationalEntityTypeBuilderExtensions.cs b/src/EFCore.Relational/Extensions/RelationalEntityTypeBuilderExtensions.cs index 3998a996b4a..98000b2490b 100644 --- a/src/EFCore.Relational/Extensions/RelationalEntityTypeBuilderExtensions.cs +++ b/src/EFCore.Relational/Extensions/RelationalEntityTypeBuilderExtensions.cs @@ -51,7 +51,7 @@ public static EntityTypeBuilder ToTable( { Check.NotNull(buildAction, nameof(buildAction)); - buildAction(new TableBuilder(entityTypeBuilder)); + buildAction(new TableBuilder(null, null, entityTypeBuilder)); return entityTypeBuilder; } @@ -76,7 +76,7 @@ public static EntityTypeBuilder ToTable( entityTypeBuilder.Metadata.SetTableName(name); entityTypeBuilder.Metadata.SetSchema(null); - buildAction(new TableBuilder(entityTypeBuilder)); + buildAction(new TableBuilder(name, null, entityTypeBuilder)); return entityTypeBuilder; } @@ -192,7 +192,7 @@ public static EntityTypeBuilder ToTable( entityTypeBuilder.Metadata.SetTableName(name); entityTypeBuilder.Metadata.SetSchema(schema); - buildAction(new TableBuilder(entityTypeBuilder)); + buildAction(new TableBuilder(name, schema, entityTypeBuilder)); return entityTypeBuilder; } @@ -281,7 +281,7 @@ public static OwnedNavigationBuilder ToTable( { Check.NotNull(buildAction, nameof(buildAction)); - buildAction(new OwnedNavigationTableBuilder(referenceOwnershipBuilder)); + buildAction(new OwnedNavigationTableBuilder(null, null, referenceOwnershipBuilder)); return referenceOwnershipBuilder; } @@ -303,7 +303,7 @@ public static OwnedNavigationBuilder ToTable(referenceOwnershipBuilder)); + buildAction(new OwnedNavigationTableBuilder(null, null, referenceOwnershipBuilder)); return referenceOwnershipBuilder; } @@ -344,7 +344,7 @@ public static OwnedNavigationBuilder ToTable( referenceOwnershipBuilder.OwnedEntityType.SetTableName(name); referenceOwnershipBuilder.OwnedEntityType.SetSchema(null); - buildAction(new OwnedNavigationTableBuilder(referenceOwnershipBuilder)); + buildAction(new OwnedNavigationTableBuilder(name, null, referenceOwnershipBuilder)); return referenceOwnershipBuilder; } @@ -371,7 +371,7 @@ public static OwnedNavigationBuilder ToTable(referenceOwnershipBuilder)); + buildAction(new OwnedNavigationTableBuilder(name, null, referenceOwnershipBuilder)); return referenceOwnershipBuilder; } @@ -423,7 +423,7 @@ public static OwnedNavigationBuilder ToTable( referenceOwnershipBuilder.OwnedEntityType.SetTableName(name); referenceOwnershipBuilder.OwnedEntityType.SetSchema(schema); - buildAction(new OwnedNavigationTableBuilder(referenceOwnershipBuilder)); + buildAction(new OwnedNavigationTableBuilder(name, schema, referenceOwnershipBuilder)); return referenceOwnershipBuilder; } @@ -472,7 +472,7 @@ public static OwnedNavigationBuilder ToTable(referenceOwnershipBuilder)); + buildAction(new OwnedNavigationTableBuilder(name, schema, referenceOwnershipBuilder)); return referenceOwnershipBuilder; } diff --git a/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder.cs b/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder.cs index 0c36a863602..f8c5214cbe4 100644 --- a/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder.cs +++ b/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder.cs @@ -18,11 +18,23 @@ public class OwnedNavigationTableBuilder /// doing so can result in application failures when updating to a new Entity Framework Core release. /// [EntityFrameworkInternal] - public OwnedNavigationTableBuilder(OwnedNavigationBuilder ownedNavigationBuilder) + public OwnedNavigationTableBuilder(string? name, string? schema, OwnedNavigationBuilder ownedNavigationBuilder) { + Name = name; + Schema = schema; OwnedNavigationBuilder = ownedNavigationBuilder; } + /// + /// The specified table name. + /// + public virtual string? Name { get; } + + /// + /// The specified table schema. + /// + public virtual string? Schema { get; } + /// /// The entity type being configured. /// diff --git a/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder`.cs b/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder`.cs index ff74ddd1933..af93328a20f 100644 --- a/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder`.cs +++ b/src/EFCore.Relational/Metadata/Builders/OwnedNavigationTableBuilder`.cs @@ -18,8 +18,8 @@ public class OwnedNavigationTableBuilder : OwnedNavigationTableBuilder /// doing so can result in application failures when updating to a new Entity Framework Core release. /// [EntityFrameworkInternal] - public OwnedNavigationTableBuilder(OwnedNavigationBuilder referenceOwnershipBuilder) - : base(referenceOwnershipBuilder) + public OwnedNavigationTableBuilder(string? name, string? schema, OwnedNavigationBuilder referenceOwnershipBuilder) + : base(name, schema, referenceOwnershipBuilder) { } diff --git a/src/EFCore.Relational/Metadata/Builders/TableBuilder.cs b/src/EFCore.Relational/Metadata/Builders/TableBuilder.cs index cd913ad8774..8a74222b55d 100644 --- a/src/EFCore.Relational/Metadata/Builders/TableBuilder.cs +++ b/src/EFCore.Relational/Metadata/Builders/TableBuilder.cs @@ -18,11 +18,23 @@ public class TableBuilder /// doing so can result in application failures when updating to a new Entity Framework Core release. /// [EntityFrameworkInternal] - public TableBuilder(EntityTypeBuilder entityTypeBuilder) + public TableBuilder(string? name, string? schema, EntityTypeBuilder entityTypeBuilder) { + Name = name; + Schema = schema; EntityTypeBuilder = entityTypeBuilder; } + /// + /// The specified table name. + /// + public virtual string? Name { get; } + + /// + /// The specified table schema. + /// + public virtual string? Schema { get; } + /// /// The entity type being configured. /// diff --git a/src/EFCore.Relational/Metadata/Builders/TableBuilder`.cs b/src/EFCore.Relational/Metadata/Builders/TableBuilder`.cs index 2a238815dd9..c02dd30e4f5 100644 --- a/src/EFCore.Relational/Metadata/Builders/TableBuilder`.cs +++ b/src/EFCore.Relational/Metadata/Builders/TableBuilder`.cs @@ -19,7 +19,7 @@ public class TableBuilder : TableBuilder /// [EntityFrameworkInternal] public TableBuilder(string? name, string? schema, EntityTypeBuilder entityTypeBuilder) - : base(entityTypeBuilder) + : base(name, schema, entityTypeBuilder) { } diff --git a/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder.cs b/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder.cs index 2824ca108ab..c067f3a93de 100644 --- a/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder.cs +++ b/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder.cs @@ -35,11 +35,7 @@ public OwnedNavigationTemporalTableBuilder(OwnedNavigationBuilder referenceOwner /// The name of the history table. /// The same builder instance so that multiple calls can be chained. public virtual OwnedNavigationTemporalTableBuilder UseHistoryTable(string name) - { - _referenceOwnershipBuilder.OwnedEntityType.SetHistoryTableName(name); - - return this; - } + => UseHistoryTable(name, null); /// /// Configures a history table for the entity mapped to a temporal table. diff --git a/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder`.cs b/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder`.cs index c5ae7530334..2eb7cc7a7f1 100644 --- a/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder`.cs +++ b/src/EFCore.SqlServer/Metadata/Builders/OwnedNavigationTemporalTableBuilder`.cs @@ -23,6 +23,18 @@ public OwnedNavigationTemporalTableBuilder(OwnedNavigationBuilder referenceOwner { } + /// + /// Configures a history table for the entity mapped to a temporal table. + /// + /// + /// See Using SQL Server temporal tables with EF Core + /// for more information. + /// + /// The name of the history table. + /// The same builder instance so that multiple calls can be chained. + public new virtual OwnedNavigationTemporalTableBuilder UseHistoryTable(string name) + => (OwnedNavigationTemporalTableBuilder)base.UseHistoryTable(name); + /// /// Configures a history table for the entity mapped to a temporal table. /// @@ -33,6 +45,6 @@ public OwnedNavigationTemporalTableBuilder(OwnedNavigationBuilder referenceOwner /// The name of the history table. /// The schema of the history table. /// The same builder instance so that multiple calls can be chained. - public new virtual OwnedNavigationTemporalTableBuilder UseHistoryTable(string name, string? schema = null) + public new virtual OwnedNavigationTemporalTableBuilder UseHistoryTable(string name, string? schema) => (OwnedNavigationTemporalTableBuilder)base.UseHistoryTable(name, schema); } diff --git a/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder.cs b/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder.cs index c7b9f353eff..a62bfc54250 100644 --- a/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder.cs +++ b/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder.cs @@ -35,11 +35,7 @@ public TemporalTableBuilder(EntityTypeBuilder entityTypeBuilder) /// The name of the history table. /// The same builder instance so that multiple calls can be chained. public virtual TemporalTableBuilder UseHistoryTable(string name) - { - _entityTypeBuilder.Metadata.SetHistoryTableName(name); - - return this; - } + => UseHistoryTable(name, null); /// /// Configures a history table for the entity mapped to a temporal table. diff --git a/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder`.cs b/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder`.cs index fd006adbc99..8afbd9aab12 100644 --- a/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder`.cs +++ b/src/EFCore.SqlServer/Metadata/Builders/TemporalTableBuilder`.cs @@ -23,6 +23,18 @@ public TemporalTableBuilder(EntityTypeBuilder entityTypeBuilder) { } + /// + /// Configures a history table for the entity mapped to a temporal table. + /// + /// + /// See Using SQL Server temporal tables with EF Core + /// for more information and examples. + /// + /// The name of the history table. + /// The same builder instance so that multiple calls can be chained. + public new virtual TemporalTableBuilder UseHistoryTable(string name) + => (TemporalTableBuilder)base.UseHistoryTable(name); + /// /// Configures a history table for the entity mapped to a temporal table. /// @@ -33,6 +45,6 @@ public TemporalTableBuilder(EntityTypeBuilder entityTypeBuilder) /// The name of the history table. /// The schema of the history table. /// The same builder instance so that multiple calls can be chained. - public new virtual TemporalTableBuilder UseHistoryTable(string name, string? schema = null) + public new virtual TemporalTableBuilder UseHistoryTable(string name, string? schema) => (TemporalTableBuilder)base.UseHistoryTable(name, schema); } diff --git a/test/EFCore.Relational.Tests/ModelBuilding/RelationalModelBuilderTest.cs b/test/EFCore.Relational.Tests/ModelBuilding/RelationalModelBuilderTest.cs index eec6cde04b5..6ff38786a8d 100644 --- a/test/EFCore.Relational.Tests/ModelBuilding/RelationalModelBuilderTest.cs +++ b/test/EFCore.Relational.Tests/ModelBuilding/RelationalModelBuilderTest.cs @@ -11,6 +11,10 @@ public class RelationalModelBuilderTest : ModelBuilderTest public abstract class TestTableBuilder where TEntity : class { + public abstract string? Name { get; } + + public abstract string? Schema { get; } + public abstract TestTableBuilder ExcludeFromMigrations(bool excluded = true); } @@ -22,9 +26,15 @@ public GenericTestTableBuilder(TableBuilder tableBuilder) TableBuilder = tableBuilder; } - protected TableBuilder TableBuilder { get; } + private TableBuilder TableBuilder { get; } + + public override string? Name + => TableBuilder.Name; + + public override string? Schema + => TableBuilder.Schema; - public TableBuilder Instance + TableBuilder IInfrastructure>.Instance => TableBuilder; protected virtual TestTableBuilder Wrap(TableBuilder tableBuilder) @@ -42,9 +52,15 @@ public NonGenericTestTableBuilder(TableBuilder tableBuilder) TableBuilder = tableBuilder; } - protected TableBuilder TableBuilder { get; } + private TableBuilder TableBuilder { get; } - public TableBuilder Instance + public override string? Name + => TableBuilder.Name; + + public override string? Schema + => TableBuilder.Schema; + + TableBuilder IInfrastructure.Instance => TableBuilder; protected virtual TestTableBuilder Wrap(TableBuilder tableBuilder) @@ -57,10 +73,16 @@ public override TestTableBuilder ExcludeFromMigrations(bool excluded = public abstract class TestOwnedNavigationTableBuilder where TEntity : class { + public abstract string? Name { get; } + + public abstract string? Schema { get; } + public abstract TestOwnedNavigationTableBuilder ExcludeFromMigrations(bool excluded = true); } - public class GenericTestOwnedNavigationTableBuilder : TestOwnedNavigationTableBuilder, IInfrastructure> + public class GenericTestOwnedNavigationTableBuilder : + TestOwnedNavigationTableBuilder, + IInfrastructure> where TEntity : class { public GenericTestOwnedNavigationTableBuilder(OwnedNavigationTableBuilder tableBuilder) @@ -68,9 +90,16 @@ public GenericTestOwnedNavigationTableBuilder(OwnedNavigationTableBuilder TableBuilder { get; } + private OwnedNavigationTableBuilder TableBuilder { get; } + + public override string? Name + => TableBuilder.Name; - public OwnedNavigationTableBuilder Instance => TableBuilder; + public override string? Schema + => TableBuilder.Schema; + + OwnedNavigationTableBuilder IInfrastructure>.Instance + => TableBuilder; protected virtual TestOwnedNavigationTableBuilder Wrap(OwnedNavigationTableBuilder tableBuilder) => new GenericTestOwnedNavigationTableBuilder(tableBuilder); @@ -87,9 +116,16 @@ public NonGenericTestOwnedNavigationTableBuilder(OwnedNavigationTableBuilder tab TableBuilder = tableBuilder; } - protected OwnedNavigationTableBuilder TableBuilder { get; } + private OwnedNavigationTableBuilder TableBuilder { get; } - public OwnedNavigationTableBuilder Instance => TableBuilder; + public override string? Name + => TableBuilder.Name; + + public override string? Schema + => TableBuilder.Schema; + + OwnedNavigationTableBuilder IInfrastructure.Instance + => TableBuilder; protected virtual TestOwnedNavigationTableBuilder Wrap(OwnedNavigationTableBuilder tableBuilder) => new NonGenericTestOwnedNavigationTableBuilder(tableBuilder); @@ -110,9 +146,9 @@ public NonGenericTestCheckConstraintBuilder(CheckConstraintBuilder checkConstrai CheckConstraintBuilder = checkConstraintBuilder; } - protected CheckConstraintBuilder CheckConstraintBuilder { get; } + private CheckConstraintBuilder CheckConstraintBuilder { get; } - public CheckConstraintBuilder Instance + CheckConstraintBuilder IInfrastructure.Instance => CheckConstraintBuilder; protected virtual TestCheckConstraintBuilder Wrap(CheckConstraintBuilder checkConstraintBuilder) diff --git a/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs b/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs index 4c7b694d633..51ce5387750 100644 --- a/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs +++ b/test/EFCore.Relational.Tests/ModelBuilding/RelationalTestModelBuilderExtensions.cs @@ -146,6 +146,25 @@ public static ModelBuilderTest.TestEntityTypeBuilder ToTable( return builder; } + public static ModelBuilderTest.TestEntityTypeBuilder ToTable( + this ModelBuilderTest.TestEntityTypeBuilder builder, + Action> buildAction) + where TEntity : class + { + switch (builder) + { + case IInfrastructure> genericBuilder: + genericBuilder.Instance.ToTable(b => buildAction(new RelationalModelBuilderTest.GenericTestTableBuilder(b))); + break; + case IInfrastructure nongenericBuilder: + nongenericBuilder.Instance.ToTable( + b => buildAction(new RelationalModelBuilderTest.NonGenericTestTableBuilder(b))); + break; + } + + return builder; + } + public static ModelBuilderTest.TestEntityTypeBuilder ToTable( this ModelBuilderTest.TestEntityTypeBuilder builder, string? name, @@ -232,6 +251,27 @@ public static ModelBuilderTest.TestOwnedNavigationBuilder ToTable( + this ModelBuilderTest.TestOwnedNavigationBuilder builder, + Action> buildAction) + where TOwnerEntity : class + where TRelatedEntity : class + { + switch (builder) + { + case IInfrastructure> genericBuilder: + genericBuilder.Instance.ToTable( + b => buildAction(new RelationalModelBuilderTest.GenericTestOwnedNavigationTableBuilder(b))); + break; + case IInfrastructure nongenericBuilder: + nongenericBuilder.Instance.ToTable( + b => buildAction(new RelationalModelBuilderTest.NonGenericTestOwnedNavigationTableBuilder(b))); + break; + } + + return builder; + } + public static ModelBuilderTest.TestOwnedNavigationBuilder ToTable( this ModelBuilderTest.TestOwnedNavigationBuilder builder, string? name, diff --git a/test/EFCore.SqlServer.FunctionalTests/SqlServerApiConsistencyTest.cs b/test/EFCore.SqlServer.FunctionalTests/SqlServerApiConsistencyTest.cs index b345098aae3..a176589a48d 100644 --- a/test/EFCore.SqlServer.FunctionalTests/SqlServerApiConsistencyTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/SqlServerApiConsistencyTest.cs @@ -30,7 +30,14 @@ public class SqlServerApiConsistencyFixture : ApiConsistencyFixtureBase typeof(SqlServerModelBuilderExtensions), typeof(SqlServerPropertyBuilderExtensions), typeof(SqlServerEntityTypeBuilderExtensions), - typeof(SqlServerServiceCollectionExtensions) + typeof(SqlServerServiceCollectionExtensions), + typeof(SqlServerDbFunctionsExtensions), + typeof(OwnedNavigationTemporalPeriodPropertyBuilder), + typeof(TemporalPeriodPropertyBuilder), + typeof(OwnedNavigationTemporalTableBuilder), + typeof(OwnedNavigationTemporalTableBuilder<>), + typeof(TemporalTableBuilder), + typeof(TemporalTableBuilder<>) }; public override diff --git a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs index 666b2d1f06e..d0fe859cf83 100644 --- a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs +++ b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs @@ -639,7 +639,13 @@ public virtual void Owned_types_can_be_mapped_to_different_tables() modelBuilder.Entity( bb => { - bb.ToTable("BT", "BS", t => t.ExcludeFromMigrations()); + bb.ToTable("BT", "BS", t => + { + t.ExcludeFromMigrations(); + + Assert.Equal("BT", t.Name); + Assert.Equal("BS", t.Schema); + }); bb.OwnsOne( b => b.AlternateLabel, tb => { @@ -652,7 +658,13 @@ public virtual void Owned_types_can_be_mapped_to_different_tables() l => l.AnotherBookLabel, ab => { ab.Ignore(l => l.Book); - ab.ToTable("AT1", "AS1", t => t.ExcludeFromMigrations(false)); + ab.ToTable("AT1", "AS1", t => + { + t.ExcludeFromMigrations(false); + + Assert.Equal("AT1", t.Name); + Assert.Equal("AS1", t.Schema); + }); ab.OwnsOne(s => s.SpecialBookLabel) .ToTable("ST11", "SS11") .Ignore(l => l.Book) @@ -934,7 +946,12 @@ public virtual void Temporal_table_default_settings() var modelBuilder = CreateModelBuilder(); var model = modelBuilder.Model; - modelBuilder.Entity().ToTable(tb => tb.IsTemporal()); + modelBuilder.Entity().ToTable(tb => + { + tb.IsTemporal(); + Assert.Null(tb.Name); + Assert.Null(tb.Schema); + }); modelBuilder.FinalizeModel(); var entity = model.FindEntityType(typeof(Customer)); @@ -1251,7 +1268,6 @@ public abstract class TestTemporalTableBuilder where TEntity : class { public abstract TestTemporalTableBuilder UseHistoryTable(string name, string schema); - public abstract TestTemporalPeriodPropertyBuilder HasPeriodStart(string propertyName); public abstract TestTemporalPeriodPropertyBuilder HasPeriodEnd(string propertyName); } @@ -1265,9 +1281,9 @@ public GenericTestTemporalTableBuilder(TemporalTableBuilder temporalTab TemporalTableBuilder = temporalTableBuilder; } - protected TemporalTableBuilder TemporalTableBuilder { get; } + private TemporalTableBuilder TemporalTableBuilder { get; } - public TemporalTableBuilder Instance + TemporalTableBuilder IInfrastructure>.Instance => TemporalTableBuilder; protected virtual TestTemporalTableBuilder Wrap(TemporalTableBuilder tableBuilder) @@ -1291,9 +1307,9 @@ public NonGenericTestTemporalTableBuilder(TemporalTableBuilder temporalTableBuil TemporalTableBuilder = temporalTableBuilder; } - protected TemporalTableBuilder TemporalTableBuilder { get; } + private TemporalTableBuilder TemporalTableBuilder { get; } - public TemporalTableBuilder Instance + TemporalTableBuilder IInfrastructure.Instance => TemporalTableBuilder; protected virtual TestTemporalTableBuilder Wrap(TemporalTableBuilder temporalTableBuilder) diff --git a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs index c0102a8eb0e..030428c099a 100644 --- a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs +++ b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerTestModelBuilderExtensions.cs @@ -44,25 +44,6 @@ public static ModelBuilderTest.TestIndexBuilder IsClustered( return builder; } - public static ModelBuilderTest.TestEntityTypeBuilder ToTable( - this ModelBuilderTest.TestEntityTypeBuilder builder, - Action> buildAction) - where TEntity : class - { - switch (builder) - { - case IInfrastructure> genericBuilder: - genericBuilder.Instance.ToTable(b => buildAction(new RelationalModelBuilderTest.GenericTestTableBuilder(b))); - break; - case IInfrastructure nongenericBuilder: - nongenericBuilder.Instance.ToTable( - b => buildAction(new RelationalModelBuilderTest.NonGenericTestTableBuilder(b))); - break; - } - - return builder; - } - public static RelationalModelBuilderTest.TestTableBuilder IsTemporal( this RelationalModelBuilderTest.TestTableBuilder builder, bool temporal = true)