From cb9130ed0870bf455d40ecfd720c64eec11c17c1 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 19 Nov 2021 09:30:21 +0100 Subject: [PATCH] Fix rewriting with OwnsMany Fixes #69 --- .../NameRewritingConventionTest.cs | 13 ++++++ .../Internal/NameRewritingConvention.cs | 46 ++++++++++--------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs b/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs index d9f7a9c..39071c8 100644 --- a/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs +++ b/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs @@ -404,6 +404,18 @@ namespace EFCore.NamingConventions.Test .GetColumnName(StoreObjectIdentifier.Create(ownedEntityType, StoreObjectType.Table)!.Value)); } + [Fact] + public void Owned_entity_withs_OwnsMany() + { + var model = BuildModel(b => b.Entity().OwnsMany(b => b.Posts)); + var ownedEntityType = model.FindEntityType(typeof(Post)); + + Assert.Equal("post", ownedEntityType.GetTableName()); + Assert.Equal("pk_post", ownedEntityType.FindPrimaryKey().GetName()); + Assert.Equal("post_title", ownedEntityType.FindProperty("PostTitle") + .GetColumnName(StoreObjectIdentifier.Create(ownedEntityType, StoreObjectType.Table)!.Value)); + } + [Fact] public void Not_mapped_to_table() { @@ -451,6 +463,7 @@ namespace EFCore.NamingConventions.Test public int PostId { get; set; } public Blog Blog { get; set; } public int BlogId { get; set; } + public string PostTitle { get; set; } } public class Parent diff --git a/EFCore.NamingConventions/Internal/NameRewritingConvention.cs b/EFCore.NamingConventions/Internal/NameRewritingConvention.cs index 0f5d258..113d8db 100644 --- a/EFCore.NamingConventions/Internal/NameRewritingConvention.cs +++ b/EFCore.NamingConventions/Internal/NameRewritingConvention.cs @@ -79,11 +79,14 @@ namespace EFCore.NamingConventions.Internal var foreignKey = relationshipBuilder.Metadata; var ownedEntityType = foreignKey.DeclaringEntityType; - if (foreignKey.IsOwnership && ownedEntityType.GetTableNameConfigurationSource() != ConfigurationSource.Explicit) + // An entity type is becoming owned - this is a bit complicated. + // Unless it's a collection navigation, or the owned entity table name was explicitly set by the user, this triggers table + // splitting, which means we need to undo rewriting which we've done previously. + if (foreignKey.IsOwnership + && !foreignKey.GetNavigation(false).IsCollection + && ownedEntityType.GetTableNameConfigurationSource() != ConfigurationSource.Explicit) { - // An entity type is becoming owned - this is complicated. - - // Reset the table name which we've set when the entity type was added + // Reset the table name which we've set when the entity type was added. // If table splitting was configured by explicitly setting the table name, the following // does nothing. ownedEntityType.Builder.HasNoAnnotation(RelationalAnnotationNames.TableName); @@ -183,14 +186,7 @@ namespace EFCore.NamingConventions.Internal => relationshipBuilder.HasConstraintName(_namingNameRewriter.RewriteName(relationshipBuilder.Metadata.GetDefaultName())); public void ProcessKeyAdded(IConventionKeyBuilder keyBuilder, IConventionContext context) - { - var entityType = keyBuilder.Metadata.DeclaringEntityType; - - if (entityType.FindOwnership() is null) - { - keyBuilder.HasName(_namingNameRewriter.RewriteName(keyBuilder.Metadata.GetDefaultName())); - } - } + => keyBuilder.HasName(_namingNameRewriter.RewriteName(keyBuilder.Metadata.GetName())); public void ProcessIndexAdded( IConventionIndexBuilder indexBuilder, @@ -218,17 +214,21 @@ namespace EFCore.NamingConventions.Internal { var identifier = StoreObjectIdentifier.Create(entityType, storeObjectType); if (identifier is null) - continue; - - if (property.GetColumnNameConfigurationSource(identifier.Value) == ConfigurationSource.Convention) { - columnName = property.GetColumnName(identifier.Value); - if (columnName.StartsWith(entityType.ShortName() + '_', StringComparison.Ordinal)) - { - property.Builder.HasColumnName( - _namingNameRewriter.RewriteName(entityType.ShortName()) - + columnName.Substring(entityType.ShortName().Length)); - } + continue; + } + + if (property.GetColumnNameConfigurationSource(identifier.Value) != ConfigurationSource.Convention) + { + continue; + } + + columnName = property.GetColumnName(identifier.Value); + if (columnName.StartsWith(entityType.ShortName() + '_', StringComparison.Ordinal)) + { + property.Builder.HasColumnName( + _namingNameRewriter.RewriteName(entityType.ShortName()) + + columnName.Substring(entityType.ShortName().Length)); } } } @@ -254,7 +254,9 @@ namespace EFCore.NamingConventions.Internal { var identifier = StoreObjectIdentifier.Create(entityType, storeObjectType); if (identifier is null) + { continue; + } if (property.GetColumnNameConfigurationSource(identifier.Value) == ConfigurationSource.Convention) {