From 6b570cd5e3ea71cd5f55864cd6815e7506973255 Mon Sep 17 00:00:00 2001 From: LiamL Date: Wed, 15 Jan 2020 14:56:06 +0000 Subject: [PATCH] adds fk index to cmsDictionary -> parentId --- .../Migrations/Upgrade/UmbracoPlan.cs | 3 ++ .../AddDatabaseIndexesMissingOnForeignKeys.cs | 53 +++++++++++++++++++ .../Persistence/Dtos/DictionaryDto.cs | 4 +- src/Umbraco.Core/Umbraco.Core.csproj | 1 + 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddDatabaseIndexesMissingOnForeignKeys.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs index 3b2005bef6..b32d9fa550 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs @@ -187,6 +187,9 @@ namespace Umbraco.Core.Migrations.Upgrade To("{3D67D2C8-5E65-47D0-A9E1-DC2EE0779D6B}"); To("{EE288A91-531B-4995-8179-1D62D9AA3E2E}"); + + To("{a78e3369-8ea3-40ec-ad3f-5f76929d2b20}"); + //FINAL } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddDatabaseIndexesMissingOnForeignKeys.cs b/src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddDatabaseIndexesMissingOnForeignKeys.cs new file mode 100644 index 0000000000..1fcb855eef --- /dev/null +++ b/src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddDatabaseIndexesMissingOnForeignKeys.cs @@ -0,0 +1,53 @@ +using NPoco; +using System; +using System.Linq; +using Umbraco.Core.Persistence.DatabaseAnnotations; +using Umbraco.Core.Persistence.Dtos; + +namespace Umbraco.Core.Migrations.Upgrade.V_8_6_0 +{ + public class AddDatabaseIndexesMissingOnForeignKeys : MigrationBase + { + public AddDatabaseIndexesMissingOnForeignKeys(IMigrationContext context) + : base(context) + { + + } + + public override void Migrate() + { + var newIndexes = new[] + { + (typeof(DictionaryDto), nameof(DictionaryDto.Parent)) + }; + + foreach (var (type, propertyName) in newIndexes) + { + CreateIndexIfNotExists(type, propertyName); + } + } + + private void CreateIndexIfNotExists(Type dto, string propertyName) + { + var property = dto.GetProperty(propertyName); + var indexName = property.GetCustomAttributes(false).OfType().Single().Name; + + if (IndexExists(indexName)) + { + return; + } + + var tableName = dto.GetCustomAttributes(false).Single().Value; + var columnName = property.GetCustomAttributes(false).OfType().Single().Name; + + + Create + .Index(indexName) + .OnTable(tableName) + .OnColumn(columnName) + .Ascending() + .WithOptions().NonClustered() // All newly defined indexes are non-clustered + .Do(); + } + } +} diff --git a/src/Umbraco.Core/Persistence/Dtos/DictionaryDto.cs b/src/Umbraco.Core/Persistence/Dtos/DictionaryDto.cs index 655474b217..d357e9adbc 100644 --- a/src/Umbraco.Core/Persistence/Dtos/DictionaryDto.cs +++ b/src/Umbraco.Core/Persistence/Dtos/DictionaryDto.cs @@ -5,11 +5,12 @@ using Umbraco.Core.Persistence.DatabaseAnnotations; namespace Umbraco.Core.Persistence.Dtos { - [TableName(Constants.DatabaseSchema.Tables.DictionaryEntry)] + [TableName(TableName)] [PrimaryKey("pk")] [ExplicitColumns] internal class DictionaryDto { + public const string TableName = Constants.DatabaseSchema.Tables.DictionaryEntry; [Column("pk")] [PrimaryKeyColumn] public int PrimaryKey { get; set; } @@ -21,6 +22,7 @@ namespace Umbraco.Core.Persistence.Dtos [Column("parent")] [NullSetting(NullSetting = NullSettings.Null)] [ForeignKey(typeof(DictionaryDto), Column = "id")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Parent")] public Guid? Parent { get; set; } [Column("key")] diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 1393971898..01cbb66fb6 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -129,6 +129,7 @@ --> +