From cae6e02ceb8b427e03e268e17195ac2f9d441fc4 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Thu, 15 Jul 2021 16:53:42 +0200 Subject: [PATCH] Fix migration to handle identical aliases for different group names and write error to log --- .../V_8_16_0/AddPropertyTypeGroupColumns.cs | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_16_0/AddPropertyTypeGroupColumns.cs b/src/Umbraco.Core/Migrations/Upgrade/V_8_16_0/AddPropertyTypeGroupColumns.cs index 6363172609..ce02d15e0d 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/V_8_16_0/AddPropertyTypeGroupColumns.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/V_8_16_0/AddPropertyTypeGroupColumns.cs @@ -1,4 +1,5 @@ using System.Linq; +using Umbraco.Core.Logging; using Umbraco.Core.Persistence.Dtos; namespace Umbraco.Core.Migrations.Upgrade.V_8_16_0 @@ -12,16 +13,40 @@ namespace Umbraco.Core.Migrations.Upgrade.V_8_16_0 public override void Migrate() { AddColumn("type"); - AddColumn("alias", out var sqls); - var dtos = Database.Fetch(); - foreach (var dto in dtos) - { - // Generate alias from current name - dto.Alias = dto.Text.ToSafeAlias(true); - Database.Update(dto, x => new { x.Alias }); + AddColumn("alias", out var sqls); + + var dtos = Database.Fetch(); + foreach (var dtosPerAlias in dtos.GroupBy(x => x.Text.ToSafeAlias(true))) + { + var dtosPerAliasAndText = dtosPerAlias.GroupBy(x => x.Text); + var numberSuffix = 1; + foreach (var dtosPerText in dtosPerAliasAndText) + { + foreach (var dto in dtosPerText) + { + dto.Alias = dtosPerAlias.Key; + + if (numberSuffix > 1) + { + // More than 1 name found for the alias, so add a suffix + dto.Alias += numberSuffix; + } + + Database.Update(dto, x => new { x.Alias }); + } + + numberSuffix++; + } + + if (numberSuffix > 2) + { + Logger.Error("Detected the same alias {Alias} for different property group names {Names}, the migration added suffixes, but this might break backwards compatibility.", dtosPerAlias.Key, dtosPerAliasAndText.Select(x => x.Key)); + } } - foreach (var sql in sqls) Database.Execute(sql); + + foreach (var sql in sqls) + Database.Execute(sql); } } }