From f3f03e5ce0e1f9459c3f53363008251964f7f424 Mon Sep 17 00:00:00 2001 From: Arthur Vickers Date: Tue, 25 Aug 2020 10:48:14 -0700 Subject: [PATCH] Stop using DbSet property name for table name of shared type entity types Fixes #22126 --- .../TableNameFromDbSetConvention.cs | 2 + .../DbSetAsTableNameTest.cs | 53 +++++++++++++++++++ .../DbSetAsTableNameSqlServerTest.cs | 3 ++ .../DbSetAsTableNameSqliteTest.cs | 3 ++ 4 files changed, 61 insertions(+) diff --git a/src/EFCore.Relational/Metadata/Conventions/TableNameFromDbSetConvention.cs b/src/EFCore.Relational/Metadata/Conventions/TableNameFromDbSetConvention.cs index 27fdbffd693..8b30cc06273 100644 --- a/src/EFCore.Relational/Metadata/Conventions/TableNameFromDbSetConvention.cs +++ b/src/EFCore.Relational/Metadata/Conventions/TableNameFromDbSetConvention.cs @@ -83,6 +83,7 @@ public virtual void ProcessEntityTypeBaseTypeChanged( else if (oldBaseType != null && newBaseType == null && entityType.ClrType != null + && !entityType.HasSharedClrType && _sets.TryGetValue(entityType.ClrType, out var setName)) { entityTypeBuilder.ToTable(setName); @@ -101,6 +102,7 @@ public virtual void ProcessEntityTypeAdded( var entityType = entityTypeBuilder.Metadata; if (entityType.BaseType == null && entityType.ClrType != null + && !entityType.HasSharedClrType && _sets.TryGetValue(entityType.ClrType, out var setName)) { entityTypeBuilder.ToTable(setName); diff --git a/test/EFCore.Relational.Tests/DbSetAsTableNameTest.cs b/test/EFCore.Relational.Tests/DbSetAsTableNameTest.cs index 840ce4180f9..050a61d4e65 100644 --- a/test/EFCore.Relational.Tests/DbSetAsTableNameTest.cs +++ b/test/EFCore.Relational.Tests/DbSetAsTableNameTest.cs @@ -54,6 +54,28 @@ public virtual void Explicit_names_can_be_used_as_table_names() Assert.Equal("YummyCheese", GetTableName(context)); } + [ConditionalFact] + public virtual void DbSet_names_are_not_used_as_shared_entity_type_table_names() + { + using var context = CreateContext(); + + Assert.Equal("Bovril", GetTableName(context, "Bovril")); + Assert.Equal("Beefy", GetTableName(context, "Beefy")); + Assert.Equal("Imposter", GetTableName(context, "Imposter")); + Assert.Equal("Veggies", GetTableName(context, "Veggies")); + } + + [ConditionalFact] + public virtual void Explicit_names_can_be_used_for_shared_type_entity_types() + { + using var context = CreateNamedTablesContext(); + + Assert.Equal("MyBovrils", GetTableName(context, "Bovril")); + Assert.Equal("MyBeefies", GetTableName(context, "Beefy")); + Assert.Equal("MyImposter", GetTableName(context, "Imposter")); + Assert.Equal("MyVeggies", GetTableName(context, "Veggies")); + } + [ConditionalFact] public virtual void Explicit_name_of_base_type_can_be_used_as_table_name_for_TPH() { @@ -89,6 +111,8 @@ public virtual void Explicit_name_can_be_used_for_type_with_duplicated_sets() protected abstract string GetTableName(DbContext context); + protected abstract string GetTableName(DbContext context, string entityTypeName); + protected abstract SetsContext CreateContext(); protected abstract class SetsContext : DbContext @@ -103,10 +127,24 @@ protected abstract class SetsContext : DbContext public DbSet Food { get; set; } public DbSet Beverage { get; set; } + public DbSet Bovrils + => Set("Bovril"); + + public DbSet Beefs + => Set("Beefy"); + + public DbSet Imposters + => Set("Imposter"); + protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(); modelBuilder.Entity(); + + modelBuilder.SharedTypeEntity("Bovril"); + modelBuilder.SharedTypeEntity("Beefy"); + modelBuilder.SharedTypeEntity("Imposter"); + modelBuilder.SharedTypeEntity("Veggies"); } } @@ -124,6 +162,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity().ToTable("YummyTriskets"); modelBuilder.Entity().ToTable("YummyWheatThins"); modelBuilder.Entity().ToTable("YummyMarmite"); + + modelBuilder.SharedTypeEntity("Bovril").ToTable("MyBovrils"); + modelBuilder.SharedTypeEntity("Beefy").ToTable("MyBeefies"); + modelBuilder.SharedTypeEntity("Imposter").ToTable("MyImposter"); + modelBuilder.SharedTypeEntity("Veggies").ToTable("MyVeggies"); } } @@ -175,5 +218,15 @@ protected class Marmite { public int Id { get; set; } } + + protected class BothEntity + { + public int Id { get; set; } + } + + protected class VeggieEntity + { + public int Id { get; set; } + } } } diff --git a/test/EFCore.SqlServer.Tests/DbSetAsTableNameSqlServerTest.cs b/test/EFCore.SqlServer.Tests/DbSetAsTableNameSqlServerTest.cs index 0fa2fb385c2..a34126924c9 100644 --- a/test/EFCore.SqlServer.Tests/DbSetAsTableNameSqlServerTest.cs +++ b/test/EFCore.SqlServer.Tests/DbSetAsTableNameSqlServerTest.cs @@ -8,6 +8,9 @@ public class DbSetAsTableNameSqlServerTest : DbSetAsTableNameTest protected override string GetTableName(DbContext context) => context.Model.FindEntityType(typeof(TEntity)).GetTableName(); + protected override string GetTableName(DbContext context, string entityTypeName) + => context.Model.FindEntityType(entityTypeName).GetTableName(); + protected override SetsContext CreateContext() => new SqlServerSetsContext(); diff --git a/test/EFCore.Sqlite.Tests/DbSetAsTableNameSqliteTest.cs b/test/EFCore.Sqlite.Tests/DbSetAsTableNameSqliteTest.cs index 599c5013155..87b779506d8 100644 --- a/test/EFCore.Sqlite.Tests/DbSetAsTableNameSqliteTest.cs +++ b/test/EFCore.Sqlite.Tests/DbSetAsTableNameSqliteTest.cs @@ -10,6 +10,9 @@ public class DbSetAsTableNameSqliteTest : DbSetAsTableNameTest protected override string GetTableName(DbContext context) => context.Model.FindEntityType(typeof(TEntity)).GetTableName(); + protected override string GetTableName(DbContext context, string entityTypeName) + => context.Model.FindEntityType(entityTypeName).GetTableName(); + protected override SetsContext CreateContext() => new SqliteSetsContext();