builder,
string? name)
diff --git a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs
index d0fe859cf83..a16912db9b5 100644
--- a/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs
+++ b/test/EFCore.SqlServer.Tests/ModelBuilding/SqlServerModelBuilderGenericTest.cs
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-
-
// ReSharper disable InconsistentNaming
namespace Microsoft.EntityFrameworkCore.ModelBuilding;
@@ -244,7 +242,27 @@ public void Index_convention_sets_filter_for_unique_index_when_base_type_changed
}
[ConditionalFact]
- public virtual void TPT_identifying_FK_are_created_only_on_declaring_type()
+ public virtual void Can_override_TPC_with_TPH()
+ {
+ var modelBuilder = CreateModelBuilder();
+
+ modelBuilder.Entity();
+ modelBuilder.Entity();
+ modelBuilder.Entity();
+ modelBuilder.Entity()
+ .UseTpcMappingStrategy()
+ .UseTphMappingStrategy();
+
+ var model = modelBuilder.FinalizeModel();
+
+ Assert.Equal("Discriminator", model.FindEntityType(typeof(PBase)).GetDiscriminatorPropertyName());
+ Assert.Equal(nameof(PBase), model.FindEntityType(typeof(PBase)).GetDiscriminatorValue());
+ Assert.Equal(nameof(P), model.FindEntityType(typeof(P)).GetDiscriminatorValue());
+ Assert.Equal(nameof(Q), model.FindEntityType(typeof(Q)).GetDiscriminatorValue());
+ }
+
+ [ConditionalFact]
+ public virtual void TPT_identifying_FK_is_created_only_on_declaring_table()
{
var modelBuilder = CreateModelBuilder();
modelBuilder.Entity()
@@ -273,11 +291,13 @@ public virtual void TPT_identifying_FK_are_created_only_on_declaring_type()
var principalType = model.FindEntityType(typeof(BigMak));
Assert.Empty(principalType.GetForeignKeys());
Assert.Empty(principalType.GetIndexes());
+ Assert.Null(principalType.FindDiscriminatorProperty());
var ingredientType = model.FindEntityType(typeof(Ingredient));
var bunType = model.FindEntityType(typeof(Bun));
Assert.Empty(bunType.GetIndexes());
+ Assert.Null(bunType.FindDiscriminatorProperty());
var bunFk = bunType.GetDeclaredForeignKeys().Single(fk => !fk.IsBaseLinking());
Assert.Equal("FK_Buns_BigMak_Id", bunFk.GetConstraintName());
Assert.Equal(
@@ -306,6 +326,64 @@ public virtual void TPT_identifying_FK_are_created_only_on_declaring_type()
Assert.Single(sesameBunFk.GetMappedConstraints());
}
+ [ConditionalFact]
+ public virtual void TPC_identifying_FKs_are_created_on_all_tables()
+ {
+ var modelBuilder = CreateModelBuilder();
+ modelBuilder.Entity()
+ .Ignore(b => b.Bun)
+ .Ignore(b => b.Pickles);
+ modelBuilder.Entity(
+ b =>
+ {
+ b.ToTable("Ingredients");
+ b.Ignore(i => i.BigMak);
+ b.UseTpcMappingStrategy();
+ });
+ modelBuilder.Entity(
+ b =>
+ {
+ b.ToTable("Buns");
+ b.HasOne(i => i.BigMak).WithOne().HasForeignKey(i => i.Id);
+ b.UseTpcMappingStrategy();
+ });
+ modelBuilder.Entity(
+ b =>
+ {
+ b.ToTable("SesameBuns");
+ });
+
+ var model = modelBuilder.FinalizeModel();
+
+ var principalType = model.FindEntityType(typeof(BigMak));
+ Assert.Empty(principalType.GetForeignKeys());
+ Assert.Empty(principalType.GetIndexes());
+ Assert.Null(principalType.FindDiscriminatorProperty());
+
+ var ingredientType = model.FindEntityType(typeof(Ingredient));
+
+ var bunType = model.FindEntityType(typeof(Bun));
+ Assert.Empty(bunType.GetIndexes());
+ Assert.Null(bunType.FindDiscriminatorProperty());
+ var bunFk = bunType.GetDeclaredForeignKeys().Single();
+ Assert.Equal("FK_Buns_BigMak_Id", bunFk.GetConstraintName());
+ Assert.Equal(
+ "FK_Buns_BigMak_Id", bunFk.GetConstraintName(
+ StoreObjectIdentifier.Create(bunType, StoreObjectType.Table).Value,
+ StoreObjectIdentifier.Create(principalType, StoreObjectType.Table).Value));
+ Assert.Equal(2, bunFk.GetMappedConstraints().Count());
+
+ Assert.Empty(bunType.GetDeclaredForeignKeys().Where(fk => fk.IsBaseLinking()));
+
+ var sesameBunType = model.FindEntityType(typeof(SesameBun));
+ Assert.Empty(sesameBunType.GetIndexes());
+ Assert.Empty(sesameBunType.GetDeclaredForeignKeys());
+ Assert.Equal(
+ "FK_SesameBuns_BigMak_Id", bunFk.GetConstraintName(
+ StoreObjectIdentifier.Create(sesameBunType, StoreObjectType.Table).Value,
+ StoreObjectIdentifier.Create(principalType, StoreObjectType.Table).Value));
+ }
+
[ConditionalFact]
public virtual void TPT_index_can_use_inherited_properties()
{