diff --git a/src/GUI/EFCorePowerTools/ViewModels/ObjectTreeViewModel.cs b/src/GUI/EFCorePowerTools/ViewModels/ObjectTreeViewModel.cs index 2692e0a91..a87bf3765 100644 --- a/src/GUI/EFCorePowerTools/ViewModels/ObjectTreeViewModel.cs +++ b/src/GUI/EFCorePowerTools/ViewModels/ObjectTreeViewModel.cs @@ -78,9 +78,16 @@ public IEnumerable GetRenamedObjects() var originalReplacers = _allSchemas.Where(s => s.SchemaName == schema.Name) .SelectMany(a => a.Tables.Where(t => t.Columns != null && t.Name == obj.Name)) .ToList(); - var ignoredReplacers = originalReplacers.SelectMany(o => o.Columns.Where(c => c.Name.Equals(c.NewName))).ToList(); - - if (objectIsRenamed || renamedColumns.Any() || ignoredReplacers.Any()) + + var ignoredReplacers = originalReplacers + .SelectMany(o => o.Columns.Where(c => c.Name.Equals(c.NewName))) + .ToList(); + + var originalNavigationReplacers = originalReplacers + .Where(o => o.Navigations != null) + .SelectMany(o => o.Navigations).ToList(); + + if (objectIsRenamed || renamedColumns.Any() || ignoredReplacers.Any() || originalNavigationReplacers.Any()) { var columnRenamers = renamedColumns .Select(c => new ColumnNamer { Name = c.Name, NewName = c.NewName }) @@ -94,7 +101,8 @@ public IEnumerable GetRenamedObjects() Name = obj.Name, NewName = obj.NewName, Columns = columnRenamers.ToList(), - }); + Navigations = originalNavigationReplacers, + }); } } diff --git a/src/GUI/RevEng.Core/ReplacingCandidateNamingService.cs b/src/GUI/RevEng.Core/ReplacingCandidateNamingService.cs index 2b6e4f588..de90d8d97 100644 --- a/src/GUI/RevEng.Core/ReplacingCandidateNamingService.cs +++ b/src/GUI/RevEng.Core/ReplacingCandidateNamingService.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Scaffolding.Internal; using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; using RevEng.Shared; @@ -13,15 +14,15 @@ namespace RevEng.Core public class ReplacingCandidateNamingService : CandidateNamingService { private readonly List _customNameOptions; - private readonly Dictionary _navigationReplacers; + private readonly List _navigationReplacers; public ReplacingCandidateNamingService(List customNameOptions) { _customNameOptions = customNameOptions; _navigationReplacers = customNameOptions - .Where(o => o.Navigations != null) - .SelectMany(o => o.Navigations) - .ToDictionary(n => n.Name, n => n.NewName); + .Where(o => o.Tables != null) + .SelectMany(t => t.Tables) + .ToList(); } public override string GenerateCandidateIdentifier(DatabaseTable originalTable) @@ -122,10 +123,32 @@ public override string GenerateCandidateIdentifier(DatabaseColumn originalColumn public override string GetPrincipalEndCandidateNavigationPropertyName(IForeignKey foreignKey, string dependentEndNavigationPropertyName) { var baseName = base.GetPrincipalEndCandidateNavigationPropertyName(foreignKey, dependentEndNavigationPropertyName); + var tableName = foreignKey.PrincipalEntityType.GetTableName(); + var schemaName = foreignKey.PrincipalEntityType.GetSchema(); + + var schema = _customNameOptions + .Where(o => o.SchemaName == schemaName + && o.Tables != null && o.Tables.Any()) + .SingleOrDefault(); - if (_navigationReplacers.TryGetValue(baseName, out string name)) + if (schema != null) { - return name; + var table = schema.Tables + .Where(t => t.Name == tableName + && t.Navigations != null) + .SingleOrDefault(); + + if (table != null) + { + var navigationRenamer = table.Navigations + .Where(n => n.Name == baseName) + .SingleOrDefault(); + + if (navigationRenamer != null && navigationRenamer.NewName != null) + { + return navigationRenamer.NewName; + } + } } return baseName; @@ -135,9 +158,32 @@ public override string GetDependentEndCandidateNavigationPropertyName(IForeignKe { var baseName = base.GetDependentEndCandidateNavigationPropertyName(foreignKey); - if (_navigationReplacers.TryGetValue(baseName, out string name)) + var tableName = foreignKey.DeclaringEntityType.GetTableName(); + var schemaName = foreignKey.DeclaringEntityType.GetSchema(); + + var schema = _customNameOptions + .Where(o => o.SchemaName == schemaName + && o.Tables != null && o.Tables.Any()) + .SingleOrDefault(); + + if (schema != null) { - return name; + var table = schema.Tables + .Where(t => t.Name == tableName + && t.Navigations != null) + .SingleOrDefault(); + + if (table != null) + { + var navigationRenamer = table.Navigations + .Where(n => n.Name == baseName) + .SingleOrDefault(); + + if (navigationRenamer != null && navigationRenamer.NewName != null) + { + return navigationRenamer.NewName; + } + } } return baseName; diff --git a/src/GUI/RevEng.Shared/Schema.cs b/src/GUI/RevEng.Shared/Schema.cs index 2f95f4e1c..e5dbd4ed9 100644 --- a/src/GUI/RevEng.Shared/Schema.cs +++ b/src/GUI/RevEng.Shared/Schema.cs @@ -20,9 +20,6 @@ public Schema() [DataMember(EmitDefaultValue = false, IsRequired = false)] public List Tables { get; set; } - [DataMember(EmitDefaultValue = false, IsRequired = false)] - public List Navigations { get; set; } - [DataMember(EmitDefaultValue = false, IsRequired = false)] public string TableRegexPattern { get; set; } diff --git a/src/GUI/RevEng.Shared/TableRenamer.cs b/src/GUI/RevEng.Shared/TableRenamer.cs index f9ceb8ea6..b7f7e111a 100644 --- a/src/GUI/RevEng.Shared/TableRenamer.cs +++ b/src/GUI/RevEng.Shared/TableRenamer.cs @@ -14,5 +14,8 @@ public class TableRenamer [DataMember(EmitDefaultValue = false, IsRequired = false)] public List Columns { get; set; } + + [DataMember(EmitDefaultValue = false, IsRequired = false)] + public List Navigations { get; set; } } } diff --git a/src/GUI/UnitTests/ViewModels/ObjectTreeViewModelTests.cs b/src/GUI/UnitTests/ViewModels/ObjectTreeViewModelTests.cs index 02eca2895..1cec2a557 100644 --- a/src/GUI/UnitTests/ViewModels/ObjectTreeViewModelTests.cs +++ b/src/GUI/UnitTests/ViewModels/ObjectTreeViewModelTests.cs @@ -120,9 +120,10 @@ public void AddObjects_Replacers_Issue679() // Arrange var vm = new ObjectTreeViewModel(CreateSchemaInformationViewModelMockObject, CreateTableInformationViewModelMockObject, CreateColumnInformationViewModelMockObject); - var objects = new TableModel[2]; + var objects = new TableModel[3]; objects[0] = new TableModel("departmentdetail", null, DatabaseType.Mysql, ObjectType.Table, new List { new ColumnModel("DEPTCode", false) }.ToArray()); objects[1] = new TableModel("employeedetail", null, DatabaseType.Mysql, ObjectType.Table, new List { new ColumnModel("EMPCode", false) }.ToArray()); + objects[2] = new TableModel("same", null, DatabaseType.Mysql, ObjectType.Table, new List { new ColumnModel("same", false) }.ToArray()); var replacers = new Schema[1]; replacers[0] = new Schema() @@ -138,7 +139,7 @@ public void AddObjects_Replacers_Issue679() Columns = new List { new ColumnNamer { Name = "DEPTCode", NewName = "DEPTCode" }, - } + }, }, new TableRenamer { @@ -147,19 +148,39 @@ public void AddObjects_Replacers_Issue679() Columns = new List { new ColumnNamer { Name = "EMPCode", NewName = "EMPCode" }, - } - } + + }, + Navigations = new List + { + new NavigationRenamer { Name = "First", NewName = "Second" }, + }, + }, + new TableRenamer + { + Name = "same", + NewName = "same", + Columns = new List(), + Navigations = new List + { + new NavigationRenamer { Name = "SameFirst", NewName = "SameSecond" }, + }, + }, }, }; // Act vm.AddObjects(objects, replacers); vm.SetSelectionState(true); - var renamers = vm.GetRenamedObjects(); + var renamers = vm.GetRenamedObjects().ToList(); // Assert - Assert.AreEqual(1, renamers.First().Tables[0].Columns.Count); - Assert.AreEqual(1, renamers.First().Tables[1].Columns.Count); + Assert.AreEqual(3, renamers[0].Tables.Count); + Assert.AreEqual(1, renamers[0].Tables[0].Columns.Count); + Assert.AreEqual(0, renamers[0].Tables[0].Navigations.Count); + Assert.AreEqual(1, renamers[0].Tables[1].Columns.Count); + Assert.AreEqual(1, renamers[0].Tables[1].Navigations.Count); + Assert.AreEqual(0, renamers[0].Tables[2].Columns.Count); + Assert.AreEqual(1, renamers[0].Tables[1].Navigations.Count); } [Test] diff --git a/src/GUI/efreveng/TestFiles/fulltest.json b/src/GUI/efreveng/TestFiles/fulltest.json index fa1d4f798..ee90e8bd9 100644 --- a/src/GUI/efreveng/TestFiles/fulltest.json +++ b/src/GUI/efreveng/TestFiles/fulltest.json @@ -4,12 +4,6 @@ "ContextNamespace": null, "CustomReplacers": [ { - "Navigations": [ - { - "Name": "ShipVia", - "NewName": "ShipBy" - } - ], "SchemaName": "dbo", "Tables": [ { @@ -21,6 +15,17 @@ ], "Name": "Categories", "NewName": "Categories" + }, + { + "Columns": [ ], + "Navigations": [ + { + "Name": "ShipVia", + "NewName": "ShipBy" + } + ], + "Name": "Orders", + "NewName": "Orders" } ], "UseSchemaName": false diff --git a/src/GUI/lib/efreveng.exe.zip b/src/GUI/lib/efreveng.exe.zip index a1b296201..04f15c28c 100644 Binary files a/src/GUI/lib/efreveng.exe.zip and b/src/GUI/lib/efreveng.exe.zip differ diff --git a/src/GUI/lib/efreveng50.exe.zip b/src/GUI/lib/efreveng50.exe.zip index b9d6076a4..2a441c118 100644 Binary files a/src/GUI/lib/efreveng50.exe.zip and b/src/GUI/lib/efreveng50.exe.zip differ diff --git a/test/ScaffoldingTester/ScaffoldingTester/efpt.renaming.json b/test/ScaffoldingTester/ScaffoldingTester/efpt.renaming.json index 75aa0b9e5..65dbe3c16 100644 --- a/test/ScaffoldingTester/ScaffoldingTester/efpt.renaming.json +++ b/test/ScaffoldingTester/ScaffoldingTester/efpt.renaming.json @@ -1,11 +1,5 @@ [ { - "Navigations": [ - { - "Name": "ShipVia", - "NewName": "ShipBy" - } - ], "SchemaName": "dbo", "Tables": [ { @@ -16,7 +10,19 @@ } ], "Name": "Categories", + "Navigations": [ ], "NewName": "Categories" + }, + { + "Columns": [ ], + "Name": "Orders", + "Navigations": [ + { + "Name": "ShipVia", + "NewName": "ShipBy" + } + ], + "NewName": "Orders" } ], "UseSchemaName": false