diff --git a/EFCore.NamingConventions.Test/RewriterTestBase.cs b/EFCore.NamingConventions.Test/RewriterTestBase.cs index 0971ab9..3189a73 100644 --- a/EFCore.NamingConventions.Test/RewriterTestBase.cs +++ b/EFCore.NamingConventions.Test/RewriterTestBase.cs @@ -14,6 +14,9 @@ namespace EFCore.NamingConventions.Test public DbSet Blog { get; set; } + protected override void OnModelCreating(ModelBuilder modelBuilder) + => modelBuilder.Entity().OwnsOne(p => p.OwnedStatistics); + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => _useNamingConvention(optionsBuilder.UseInMemoryDatabase("test")); } @@ -22,6 +25,13 @@ namespace EFCore.NamingConventions.Test { public int Id { get; set; } public string FullName { get; set; } + + public OwnedStatistics OwnedStatistics { get; set; } + } + + public class OwnedStatistics + { + public int SomeStatistic { get; set; } } } } diff --git a/EFCore.NamingConventions.Test/SnakeCaseNamingTest.cs b/EFCore.NamingConventions.Test/SnakeCaseNamingTest.cs index 0b18181..b915628 100644 --- a/EFCore.NamingConventions.Test/SnakeCaseNamingTest.cs +++ b/EFCore.NamingConventions.Test/SnakeCaseNamingTest.cs @@ -22,6 +22,14 @@ namespace EFCore.NamingConventions.Test Assert.Equal("full_name", entityType.FindProperty("FullName").GetColumnName()); } + [Fact] + public void Owned_entity_name_is_correct_when_configured() + { + using var context = CreateContext(); + var entityType = context.Model.FindEntityType(typeof(OwnedStatistics)); + Assert.Equal("simple_blog", entityType.GetTableName()); + } + TestContext CreateContext() => new TestContext(NamingConventionsExtensions.UseSnakeCaseNamingConvention); } } diff --git a/EFCore.NamingConventions/NamingConventions/Internal/NameRewriterBase.cs b/EFCore.NamingConventions/NamingConventions/Internal/NameRewriterBase.cs index 8836665..604c40d 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/NameRewriterBase.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/NameRewriterBase.cs @@ -7,7 +7,8 @@ namespace EFCore.NamingConventions.Internal /// /// This class only required so we can have common superclass for all name rewriters /// - internal abstract class NameRewriterBase : IEntityTypeAddedConvention, IPropertyAddedConvention + internal abstract class NameRewriterBase : IEntityTypeAddedConvention, IPropertyAddedConvention, + IForeignKeyOwnershipChangedConvention { public virtual void ProcessEntityTypeAdded( IConventionEntityTypeBuilder entityTypeBuilder, IConventionContext context) @@ -20,6 +21,17 @@ namespace EFCore.NamingConventions.Internal => propertyBuilder.HasColumnName( RewriteName(propertyBuilder.Metadata.GetColumnName())); + public void ProcessForeignKeyOwnershipChanged( + IConventionRelationshipBuilder relationshipBuilder, + IConventionContext context) + { + if (relationshipBuilder.Metadata.IsOwnership) + { + // Unset the table name which we've set when the entity type was added + relationshipBuilder.Metadata.DeclaringEntityType.SetTableName(null); + } + } + protected abstract string RewriteName(string name); } } diff --git a/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs b/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs index 0f22685..12575b7 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs @@ -29,6 +29,7 @@ namespace EFCore.NamingConventions.Internal conventionSet.EntityTypeAddedConventions.Add(nameRewriter); conventionSet.PropertyAddedConventions.Add(nameRewriter); + conventionSet.ForeignKeyOwnershipChangedConventions.Add(nameRewriter); return conventionSet; } }