diff --git a/src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs b/src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs index 296ef37a84a8..9ac02f409c2e 100644 --- a/src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs +++ b/src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs @@ -9,8 +9,20 @@ public static class DatabaseSchema // TODO: Why aren't all table names with the same prefix? public const string TableNamePrefix = "umbraco"; + public static class Columns + { + // Defines constants for common field names used throughout the database, to ensure + // casing is aligned wherever used. + public const string PrimaryKeyNameId = "id"; + public const string PrimaryKeyNamePk = "pk"; + public const string PrimaryKeyNameKey = "key"; + public const string NodeIdName = "nodeId"; + public const string UniqueIdName = "uniqueId"; + } + public static class Tables { + public const string Lock = TableNamePrefix + "Lock"; public const string Log = TableNamePrefix + "Log"; diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs index 9558b7e6c1d5..30d9268821d7 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class AccessDto { public const string TableName = Constants.DatabaseSchema.Tables.Access; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_umbracoAccess", AutoIncrement = false)] public Guid Id { get; set; } @@ -38,6 +39,6 @@ internal sealed class AccessDto public DateTime UpdateDate { get; set; } [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = "AccessId")] + [Reference(ReferenceType.Many, ReferenceMemberName = AccessRuleDto.AccessIdColumnName)] public List Rules { get; set; } = new(); } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs index f6d97c72b0ce..0e83d57848af 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs @@ -6,24 +6,31 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class AccessRuleDto { public const string TableName = Constants.DatabaseSchema.Tables.AccessRule; - [Column("id")] + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + + internal const string AccessIdColumnName = "accessId"; + + private const string RuleValueColumnName = "ruleValue"; + private const string RuleTypeColumnName = "ruleType"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_umbracoAccessRule", AutoIncrement = false)] public Guid Id { get; set; } - [Column("accessId")] + [Column(AccessIdColumnName)] [ForeignKey(typeof(AccessDto), Name = "FK_umbracoAccessRule_umbracoAccess_id")] public Guid AccessId { get; set; } - [Column("ruleValue")] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "ruleValue,ruleType,accessId", Name = "IX_umbracoAccessRule")] + [Column(RuleValueColumnName)] + [Index(IndexTypes.UniqueNonClustered, ForColumns = $"{RuleValueColumnName},{RuleTypeColumnName},{AccessIdColumnName}", Name = "IX_umbracoAccessRule")] public string? RuleValue { get; set; } - [Column("ruleType")] + [Column(RuleTypeColumnName)] public string? RuleType { get; set; } [Column("createDate")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs index cc88e37f18f9..0354fad8bf31 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class AuditEntryDto { public const string TableName = Constants.DatabaseSchema.Tables.AuditEntry; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/CacheInstructionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/CacheInstructionDto.cs index 0c274c31956a..6201df164d66 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/CacheInstructionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/CacheInstructionDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] public class CacheInstructionDto { public const string TableName = Constants.DatabaseSchema.Tables.CacheInstruction; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] [PrimaryKeyColumn(AutoIncrement = true, Name = "PK_umbracoCacheInstruction")] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs index 6445f992e8ad..e952064d26f0 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] public class ConsentDto { public const string TableName = Constants.DatabaseSchema.Tables.Consent; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs index d9a03c644fee..5884bbef5b4a 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs @@ -5,29 +5,33 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("nodeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class ContentDto { public const string TableName = Constants.DatabaseSchema.Tables.Content; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.NodeIdName; + public const string ContentTypeIdColumnName = "contentTypeId"; - [Column("nodeId")] + internal const string ReferenceMemberName = "NodeId"; // should be ContentVersionDto.NodeIdColumnName, but for database compatibility we keep it like this + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } - [Column("contentTypeId")] - [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] + [Column(ContentTypeIdColumnName)] + [ForeignKey(typeof(ContentTypeDto), Column = ContentTypeDto.NodeIdColumnName)] public int ContentTypeId { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "nodeId")] + [Reference(ReferenceType.OneToOne, ColumnName = PrimaryKeyColumnName)] public NodeDto NodeDto { get; set; } = null!; // although a content has many content versions, // they can only be loaded one by one (as several content), // so this here is a OneToOne reference [ResultColumn] - [Reference(ReferenceType.OneToOne, ReferenceMemberName = "nodeId")] + [Reference(ReferenceType.OneToOne, ReferenceMemberName = ReferenceMemberName)] public ContentVersionDto ContentVersionDto { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs index 2ec29776718d..af08ac65f4e2 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs @@ -6,19 +6,24 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("nodeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class ContentNuDto { public const string TableName = Constants.DatabaseSchema.Tables.NodeData; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.NodeIdName; - [Column("nodeId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsContentNu", OnColumns = "nodeId, published")] - [ForeignKey(typeof(ContentDto), Column = "nodeId", OnDelete = Rule.Cascade)] + private const string PublishedColumnName = "published"; + private const string RvColumnName = "rv"; + private const string DataRawColumnName = "dataRaw"; + + [Column(PrimaryKeyColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsContentNu", OnColumns = $"{PrimaryKeyColumnName}, {PublishedColumnName}")] + [ForeignKey(typeof(ContentDto), Column = PrimaryKeyColumnName, OnDelete = Rule.Cascade)] public int NodeId { get; set; } - [Column("published")] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_published", ForColumns = "published,nodeId,rv", IncludeColumns = "dataRaw")] + [Column(PublishedColumnName)] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_" + PublishedColumnName, ForColumns = $"{PublishedColumnName},{PrimaryKeyColumnName},{RvColumnName}", IncludeColumns = DataRawColumnName)] public bool Published { get; set; } /// @@ -32,10 +37,10 @@ public class ContentNuDto [NullSetting(NullSetting = NullSettings.Null)] public string? Data { get; set; } - [Column("rv")] + [Column(RvColumnName)] public long Rv { get; set; } - [Column("dataRaw")] + [Column(DataRawColumnName)] [NullSetting(NullSetting = NullSettings.Null)] public byte[]? RawData { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs index 5f575b77ef1f..4291a7d1baf9 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class ContentScheduleDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentSchedule; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] public Guid Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentType2ContentTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentType2ContentTypeDto.cs index a8d8a28864e6..06c96c67b10d 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentType2ContentTypeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentType2ContentTypeDto.cs @@ -9,13 +9,15 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; internal sealed class ContentType2ContentTypeDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentTypeTree; + public const string PrimaryKeyColumnName = "parentContentTypeId"; + public const string ChildIdColumnName = "childContentTypeId"; - [Column("parentContentTypeId")] - [PrimaryKeyColumn(AutoIncrement = false, Clustered = true, Name = "PK_cmsContentType2ContentType", OnColumns = "parentContentTypeId, childContentTypeId")] + [Column(PrimaryKeyColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Clustered = true, Name = "PK_cmsContentType2ContentType", OnColumns = $"{PrimaryKeyColumnName}, {ChildIdColumnName}")] [ForeignKey(typeof(NodeDto), Name = "FK_cmsContentType2ContentType_umbracoNode_parent")] public int ParentId { get; set; } - [Column("childContentTypeId")] + [Column(ChildIdColumnName)] [ForeignKey(typeof(NodeDto), Name = "FK_cmsContentType2ContentType_umbracoNode_child")] public int ChildId { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs index 95d2feec3dae..80ab39703287 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs @@ -5,22 +5,28 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("Id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class ContentTypeAllowedContentTypeDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentChildType; - [Column("Id")] - [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType", Column = "nodeId")] - [PrimaryKeyColumn(AutoIncrement = false, Clustered = true, Name = "PK_cmsContentTypeAllowedContentType", OnColumns = "Id, AllowedId")] + // To avoid any risk of casing bugs caused by inconsistencies between upgraded and new installs, we keep the casing "Id" here even though in other tables the usual casing is lower-case ("id"). + public const string PrimaryKeyColumnName = "Id"; + public const string NodeIdColumnName = Constants.DatabaseSchema.Columns.NodeIdName; + public const string SortOrderColumnName = "SortOrder"; + public const string AllowedIdColumnName = "AllowedId"; + + [Column(PrimaryKeyColumnName)] + [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType", Column = NodeIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Clustered = true, Name = "PK_cmsContentTypeAllowedContentType", OnColumns = $"{PrimaryKeyColumnName}, {AllowedIdColumnName}")] public int Id { get; set; } - [Column("AllowedId")] - [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType1", Column = "nodeId")] + [Column(AllowedIdColumnName)] + [ForeignKey(typeof(ContentTypeDto), Name = "FK_cmsContentTypeAllowedContentType_cmsContentType1", Column = NodeIdColumnName)] public int AllowedId { get; set; } - [Column("SortOrder")] + [Column(SortOrderColumnName)] [Constraint(Name = "df_cmsContentTypeAllowedContentType_sortOrder", Default = "0")] public int SortOrder { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeDto.cs index 6abef6eeba2c..91b6a3647fc6 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeDto.cs @@ -5,21 +5,26 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("pk")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal class ContentTypeDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentType; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNamePk; + public const string NodeIdColumnName = Constants.DatabaseSchema.Columns.NodeIdName; + + internal const string ReferenceColumnName = "NodeId"; // should be ContentTypeDto.NodeIdColumnName, but for database compatibility we keep it like this + private string? _alias; // Public constants to bind properties between DTOs public const string VariationsColumnName = "variations"; - [Column("pk")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(IdentitySeed = 700)] public int PrimaryKey { get; set; } - [Column("nodeId")] + [Column(NodeIdColumnName)] [ForeignKey(typeof(NodeDto))] [Index(IndexTypes.UniqueNonClustered, Name = "IX_cmsContentType")] public int NodeId { get; set; } @@ -59,6 +64,6 @@ internal class ContentTypeDto public byte Variations { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "NodeId")] + [Reference(ReferenceType.OneToOne, ColumnName = ReferenceColumnName)] public NodeDto NodeDto { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeTemplateDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeTemplateDto.cs index fd8504789105..e226a8ee7928 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeTemplateDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeTemplateDto.cs @@ -5,20 +5,22 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("contentTypeNodeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyName, AutoIncrement = false)] [ExplicitColumns] internal sealed class ContentTypeTemplateDto { public const string TableName = Constants.DatabaseSchema.Tables.DocumentType; + public const string PrimaryKeyName = "contentTypeNodeId"; + public const string TemplateNodeIdName = "templateNodeId"; - [Column("contentTypeNodeId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsDocumentType", OnColumns = "contentTypeNodeId, templateNodeId")] - [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] + [Column(PrimaryKeyName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsDocumentType", OnColumns = $"{PrimaryKeyName}, {TemplateNodeIdName}")] + [ForeignKey(typeof(ContentTypeDto), Column = ContentTypeDto.NodeIdColumnName)] [ForeignKey(typeof(NodeDto))] public int ContentTypeNodeId { get; set; } - [Column("templateNodeId")] - [ForeignKey(typeof(TemplateDto), Column = "nodeId")] + [Column(TemplateNodeIdName)] + [ForeignKey(typeof(TemplateDto), Column = TemplateDto.NodeIdColumnName)] public int TemplateNodeId { get; set; } [Column("IsDefault")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs index 9a808bf6f101..4ddd6386951e 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs @@ -5,15 +5,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("contentTypeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyName, AutoIncrement = false)] [ExplicitColumns] internal sealed class ContentVersionCleanupPolicyDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentVersionCleanupPolicy; + public const string PrimaryKeyName = "contentTypeId"; - [Column("contentTypeId")] + [Column(PrimaryKeyName)] [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoContentVersionCleanupPolicy")] - [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] + [ForeignKey(typeof(ContentTypeDto), Column = ContentTypeDto.NodeIdColumnName)] public int ContentTypeId { get; set; } [Column("preventCleanup")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs index faa3ad4f1f8e..97dbb2c34713 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs @@ -5,23 +5,31 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class ContentVersionCultureVariationDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentVersionCultureVariation; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + + private const string LanguageIdColumnName = "languageId"; + private const string VersionIdColumnName = "versionId"; + private const string UpdateUserIdColumnName = "availableUserId"; + private const string UpdateDateColumnName = "date"; + private const string NameColumnName = "name"; + private int? _updateUserId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("versionId")] + [Column(VersionIdColumnName)] [ForeignKey(typeof(ContentVersionDto))] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_VersionId", ForColumns = "versionId,languageId", IncludeColumns = "id,name,date,availableUserId")] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_VersionId", ForColumns = $"{VersionIdColumnName},{LanguageIdColumnName}", IncludeColumns = $"{PrimaryKeyColumnName},{NameColumnName},{UpdateDateColumnName},{UpdateUserIdColumnName}")] public int VersionId { get; set; } - [Column("languageId")] + [Column(LanguageIdColumnName)] [ForeignKey(typeof(LanguageDto))] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_LanguageId")] public int LanguageId { get; set; } @@ -30,13 +38,13 @@ internal sealed class ContentVersionCultureVariationDto [Ignore] public string? Culture { get; set; } - [Column("name")] + [Column(NameColumnName)] public string? Name { get; set; } - [Column("date")] // TODO: db rename to 'updateDate' + [Column(UpdateDateColumnName)] // TODO: db rename to 'updateDate' public DateTime UpdateDate { get; set; } - [Column("availableUserId")] // TODO: db rename to 'updateDate' + [Column(UpdateUserIdColumnName)] // TODO: db rename to 'updateDate' [ForeignKey(typeof(UserDto))] [NullSetting(NullSetting = NullSettings.Null)] public int? UpdateUserId diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs index a3302be04673..cf14295222a4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs @@ -6,33 +6,44 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] public class ContentVersionDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentVersion; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + + internal const string ReferenceColumnName = "NodeId"; // should be ContentTypeDto.NodeIdColumnName, but for database compatibility we keep it like this + + private const string UserIdColumnName = "userId"; + private const string VersionDateColumnName = "versionDate"; + private const string CurrentColumnName = "current"; + private const string TextColumnName = "text"; + private const string NodeIdColumnName = Constants.DatabaseSchema.Columns.NodeIdName; + private const string PreventCleanupColumnName = "preventCleanup"; + private int? _userId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("nodeId")] + [Column(NodeIdColumnName)] [ForeignKey(typeof(ContentDto))] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_NodeId", ForColumns = "nodeId,current", IncludeColumns = "id,versionDate,text,userId,preventCleanup")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_NodeId", ForColumns = $"{NodeIdColumnName},{CurrentColumnName}", IncludeColumns = $"{PrimaryKeyColumnName},{VersionDateColumnName},{TextColumnName},{UserIdColumnName},{PreventCleanupColumnName}")] public int NodeId { get; set; } - [Column("versionDate")] // TODO: db rename to 'updateDate' + [Column(VersionDateColumnName)] // TODO: db rename to 'updateDate' [Constraint(Default = SystemMethods.CurrentUTCDateTime)] public DateTime VersionDate { get; set; } - [Column("userId")] // TODO: db rename to 'updateUserId' + [Column(UserIdColumnName)] // TODO: db rename to 'updateUserId' [ForeignKey(typeof(UserDto))] [NullSetting(NullSetting = NullSettings.Null)] public int? UserId { get => _userId == 0 ? null : _userId; set => _userId = value; } // return null if zero - [Column("current")] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Current", IncludeColumns = "nodeId")] + [Column(CurrentColumnName)] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Current", IncludeColumns = NodeIdColumnName)] public bool Current { get; set; } // about current: @@ -41,15 +52,15 @@ public class ContentVersionDto // we could use a content.currentVersionId FK that would need to be nullable, or (better?) an additional table // linking a content itemt to its current version (nodeId, versionId) - that would guarantee uniqueness BUT it would // not guarantee existence - so, really... we are trusting our code to manage 'current' correctly. - [Column("text")] + [Column(TextColumnName)] [NullSetting(NullSetting = NullSettings.Null)] public string? Text { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "NodeId", ReferenceMemberName = "NodeId")] + [Reference(ReferenceType.OneToOne, ColumnName = ReferenceColumnName, ReferenceMemberName = ContentDto.ReferenceMemberName)] public ContentDto? ContentDto { get; set; } - [Column("preventCleanup")] + [Column(PreventCleanupColumnName)] [Constraint(Default = "0")] public bool PreventCleanup { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs index 52eb4bb7e3d3..041c189e8291 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs @@ -7,19 +7,22 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] [ExplicitColumns] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] public class CreatedPackageSchemaDto { public const string TableName = Constants.DatabaseSchema.Tables.CreatedPackageSchema; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + private const string NameColumnName = "name"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("name")] + [Column(NameColumnName)] [Length(255)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "name", Name = "IX_" + TableName + "_Name")] + [Index(IndexTypes.UniqueNonClustered, ForColumns = NameColumnName, Name = "IX_" + TableName + "_Name")] public string Name { get; set; } = null!; [Column("value")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DataTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DataTypeDto.cs index 9e8b4dee22c2..9ab3f834c0d5 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DataTypeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DataTypeDto.cs @@ -5,12 +5,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("nodeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class DataTypeDto { public const string TableName = Constants.DatabaseSchema.Tables.DataType; - [Column("nodeId")] + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.NodeIdName; + + internal const string ReferenceColumnName = "NodeId"; // should be DataTypeDto.PrimaryKeyColumnName, but for database compatibility we keep it like this + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } @@ -32,6 +36,6 @@ public class DataTypeDto public string? Configuration { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "NodeId")] + [Reference(ReferenceType.OneToOne, ColumnName = ReferenceColumnName)] public NodeDto NodeDto { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DictionaryDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DictionaryDto.cs index ed47cd786438..415ccc9f54b9 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DictionaryDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DictionaryDto.cs @@ -5,17 +5,21 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("pk")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] public class DictionaryDto // public as required to be accessible from Deploy for the RepairDictionaryIdsWorkItem. { public const string TableName = Constants.DatabaseSchema.Tables.DictionaryEntry; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNamePk; + public const string UniqueIdColumnName = "id"; // More commonly we use `uniqueId` for `uniqueidentifer` database fields, but it's correct for this table to use "id", as that's the name the field was given for this table when it was added. - [Column("pk")] + internal const string ReferenceColumnName = "UniqueId"; // should be DataTypeDto.PrimaryKeyColumnName, but for database compatibility we keep it like this + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int PrimaryKey { get; set; } - [Column("id")] + [Column(UniqueIdColumnName)] [Index(IndexTypes.UniqueNonClustered)] public Guid UniqueId { get; set; } @@ -31,6 +35,6 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; public string Key { get; set; } = null!; [ResultColumn] - [Reference(ReferenceType.Many, ColumnName = "UniqueId", ReferenceMemberName = "UniqueId")] + [Reference(ReferenceType.Many, ColumnName = ReferenceColumnName, ReferenceMemberName = LanguageTextDto.ReferenceMemberName)] public List LanguageTextDtos { get; set; } = []; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DistributedJobDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DistributedJobDto.cs index 2f88eae5b2ca..38e44b0923b6 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DistributedJobDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DistributedJobDto.cs @@ -1,4 +1,4 @@ -using NPoco; +using NPoco; using Umbraco.Cms.Core; using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations; using Umbraco.Cms.Infrastructure.Persistence.DatabaseModelDefinitions; @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] internal sealed class DistributedJobDto { public const string TableName = Constants.DatabaseSchema.Tables.DistributedJob; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = true)] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentCultureVariationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentCultureVariationDto.cs index e093a6ac549c..2d868f6bbaca 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentCultureVariationDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentCultureVariationDto.cs @@ -5,25 +5,29 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class DocumentCultureVariationDto { public const string TableName = Constants.DatabaseSchema.Tables.DocumentCultureVariation; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; // Public constants to bind properties between DTOs public const string PublishedColumnName = "published"; - [Column("id")] + private const string LanguageIdColumnName = "languageId"; + private const string NodeIdColumnName = "nodeId"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("nodeId")] + [Column(NodeIdColumnName)] [ForeignKey(typeof(NodeDto))] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_NodeId", ForColumns = "nodeId,languageId")] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_NodeId", ForColumns = $"{NodeIdColumnName},{LanguageIdColumnName}")] public int NodeId { get; set; } - [Column("languageId")] + [Column(LanguageIdColumnName)] [ForeignKey(typeof(LanguageDto))] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_LanguageId")] public int LanguageId { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentDto.cs index b78538f349e5..83035aa37bf5 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentDto.cs @@ -5,17 +5,17 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("nodeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class DocumentDto { public const string TableName = Constants.DatabaseSchema.Tables.Document; - + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.NodeIdName; // Public constants to bind properties between DTOs public const string PublishedColumnName = "published"; - [Column("nodeId")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] [ForeignKey(typeof(ContentDto))] public int NodeId { get; set; } @@ -43,7 +43,7 @@ public class DocumentDto // [NullSetting(NullSetting = NullSettings.Null)] // is documentVersionDto.TemplateId for the published version // public int? PublishTemplateId { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ReferenceMemberName = "NodeId")] + [Reference(ReferenceType.OneToOne, ReferenceMemberName = ContentDto.ReferenceMemberName)] public ContentDto ContentDto { get; set; } = null!; // although a content has many content versions, diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentUrlDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentUrlDto.cs index 133df789c77a..1b0bc59f608f 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentUrlDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentUrlDto.cs @@ -6,33 +6,39 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] public class DocumentUrlDto { public const string TableName = Constants.DatabaseSchema.Tables.DocumentUrl; - - [Column("id")] + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string UniqueIdColumnName = "uniqueId"; + public const string IsDraftColumnName = "isDraft"; + public const string LanguageIdColumnName = "languageId"; + public const string UrlSegmentColumnName = "urlSegment"; + public const string IsPrimaryColumnName = "isPrimary"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Clustered = false, AutoIncrement = true)] public int NodeId { get; set; } - [Index(IndexTypes.UniqueClustered, ForColumns = "uniqueId, languageId, isDraft, urlSegment", Name = "IX_" + TableName)] - [Column("uniqueId")] - [ForeignKey(typeof(NodeDto), Column = "uniqueId")] + [Index(IndexTypes.UniqueClustered, ForColumns = $"{UniqueIdColumnName}, {LanguageIdColumnName}, {IsDraftColumnName}, {UrlSegmentColumnName}", Name = "IX_" + TableName)] + [Column(UniqueIdColumnName)] + [ForeignKey(typeof(NodeDto), Column = NodeDto.KeyColumnName)] public Guid UniqueId { get; set; } - [Column("isDraft")] + [Column(IsDraftColumnName)] public bool IsDraft { get; set; } - [Column("languageId")] + [Column(LanguageIdColumnName)] [ForeignKey(typeof(LanguageDto))] public int LanguageId { get; set; } - [Column("urlSegment")] + [Column(UrlSegmentColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] public string UrlSegment { get; set; } = string.Empty; - [Column("isPrimary")] + [Column(IsPrimaryColumnName)] [Constraint(Default = 1)] public bool IsPrimary { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentVersionDto.cs index f99a6676be6e..1ff5e28e9287 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentVersionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentVersionDto.cs @@ -5,25 +5,29 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class DocumentVersionDto { public const string TableName = Constants.DatabaseSchema.Tables.DocumentVersion; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string PublishedColumnName = "published"; - [Column("id")] + private const string TemplateIdColumnName = "templateId"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] [ForeignKey(typeof(ContentVersionDto))] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_id_published", ForColumns = "id,published", IncludeColumns = "templateId")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_id_published", ForColumns = $"{PrimaryKeyColumnName},{PublishedColumnName}", IncludeColumns = TemplateIdColumnName)] public int Id { get; set; } - [Column("templateId")] + [Column(TemplateIdColumnName)] [NullSetting(NullSetting = NullSettings.Null)] - [ForeignKey(typeof(TemplateDto), Column = "nodeId")] + [ForeignKey(typeof(TemplateDto), Column = TemplateDto.NodeIdColumnName)] public int? TemplateId { get; set; } - [Column("published")] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_published", ForColumns = "published", IncludeColumns = "id,templateId")] + [Column(PublishedColumnName)] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_published", ForColumns = PublishedColumnName, IncludeColumns = $"{PrimaryKeyColumnName},{TemplateIdColumnName}")] public bool Published { get; set; } [ResultColumn] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DomainDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DomainDto.cs index 0d052689024e..36b27a68134b 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/DomainDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DomainDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class DomainDto { public const string TableName = Constants.DatabaseSchema.Tables.Domain; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs index 8720542ee6e0..a1d045e94c98 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs @@ -7,39 +7,46 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] [ExplicitColumns] -[PrimaryKey("Id")] +[PrimaryKey(PrimaryKeyColumnName)] internal sealed class ExternalLoginDto { public const string TableName = Constants.DatabaseSchema.Tables.ExternalLogin; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + private const string UserIdColumnName = "userId"; + private const string UserOrMemberKeyColumnName = "userOrMemberKey"; + private const string LoginProviderColumnName = "loginProvider"; + private const string ProviderKeyColumnName = "providerKey"; + + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } [Obsolete("This only exists to ensure you can upgrade using external logins from umbraco version where this was used to the new where it is not used")] - [ResultColumn("userId")] + [ResultColumn(UserIdColumnName)] public int? UserId { get; set; } - [Column("userOrMemberKey")] + [Column(UserOrMemberKeyColumnName)] [Index(IndexTypes.NonClustered)] public Guid UserOrMemberKey { get; set; } /// /// Used to store the name of the provider (i.e. Facebook, Google) /// - [Column("loginProvider")] + [Column(LoginProviderColumnName)] [Length(400)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "loginProvider,userOrMemberKey", Name = "IX_" + TableName + "_LoginProvider")] + [Index(IndexTypes.UniqueNonClustered, ForColumns = $"{LoginProviderColumnName},{UserOrMemberKeyColumnName}", Name = "IX_" + TableName + "_LoginProvider")] public string LoginProvider { get; set; } = null!; /// /// Stores the key the provider uses to lookup the login /// - [Column("providerKey")] + [Column(ProviderKeyColumnName)] [Length(4000)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.NonClustered, ForColumns = "loginProvider,providerKey", Name = "IX_" + TableName + "_ProviderKey")] + [Index(IndexTypes.NonClustered, ForColumns = $"{LoginProviderColumnName},{ProviderKeyColumnName}", Name = "IX_" + TableName + "_ProviderKey")] public string ProviderKey { get; set; } = null!; [Column("createDate")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs index 9e937f8d79a3..f3ffd5ae6bda 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs @@ -7,23 +7,29 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] [ExplicitColumns] -[PrimaryKey("Id")] +[PrimaryKey(PrimaryKeyColumnName)] internal sealed class ExternalLoginTokenDto { public const string TableName = Constants.DatabaseSchema.Tables.ExternalLoginToken; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + internal const string ReferenceMemberName = "ExternalLoginId"; // should be ExternalLoginIdColumnName, but for database compatibility we keep it like this + + private const string ExternalLoginIdColumnName = "externalLoginId"; + private const string NameColumnName = "name"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("externalLoginId")] - [ForeignKey(typeof(ExternalLoginDto), Column = "id")] + [Column(ExternalLoginIdColumnName)] + [ForeignKey(typeof(ExternalLoginDto), Column = ExternalLoginDto.PrimaryKeyColumnName)] public int ExternalLoginId { get; set; } - [Column("name")] + [Column(NameColumnName)] [Length(255)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "externalLoginId,name", Name = "IX_" + TableName + "_Name")] + [Index(IndexTypes.UniqueNonClustered, ForColumns = $"{ExternalLoginIdColumnName},{NameColumnName}", Name = "IX_" + TableName + "_Name")] public string Name { get; set; } = null!; [Column("value")] @@ -36,6 +42,6 @@ internal sealed class ExternalLoginTokenDto public DateTime CreateDate { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "ExternalLoginId")] + [Reference(ReferenceType.OneToOne, ColumnName = ReferenceMemberName)] public ExternalLoginDto ExternalLoginDto { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs index 7a9257423fd0..be3ae145d4e5 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs @@ -7,13 +7,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("key", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class KeyValueDto { public const string TableName = Constants.DatabaseSchema.Tables.KeyValue; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameKey; - [Column("key")] + [Column(PrimaryKeyColumnName)] [Length(256)] [PrimaryKeyColumn(AutoIncrement = false, Clustered = true)] public string Key { get; set; } = null!; diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageDto.cs index ac63485a0550..d655187b00fe 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageDto.cs @@ -5,11 +5,12 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class LanguageDto { public const string TableName = Constants.DatabaseSchema.Tables.Language; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; // Public constants to bind properties between DTOs public const string IsoCodeColumnName = "languageISOCode"; @@ -17,7 +18,7 @@ internal sealed class LanguageDto /// /// Gets or sets the identifier of the language. /// - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(IdentitySeed = 2)] public short Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageTextDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageTextDto.cs index 1cbc3a9a1557..3c4222a5cb04 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageTextDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageTextDto.cs @@ -5,23 +5,29 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("pk")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] public class LanguageTextDto { public const string TableName = Constants.DatabaseSchema.Tables.DictionaryValue; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNamePk; - [Column("pk")] + internal const string ReferenceMemberName = "UniqueId"; // for clarity in DictionaryDto reference + + private const string LanguageIdColumnName = "languageId"; + private const string UniqueIdColumnName = "UniqueId"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int PrimaryKey { get; set; } - [Column("languageId")] - [ForeignKey(typeof(LanguageDto), Column = "id")] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_languageId", ForColumns = "languageId,UniqueId")] + [Column(LanguageIdColumnName)] + [ForeignKey(typeof(LanguageDto), Column = LanguageDto.PrimaryKeyColumnName)] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_languageId", ForColumns = $"{LanguageIdColumnName},{UniqueIdColumnName}")] public int LanguageId { get; set; } - [Column("UniqueId")] - [ForeignKey(typeof(DictionaryDto), Column = "id")] + [Column(UniqueIdColumnName)] + [ForeignKey(typeof(DictionaryDto), Column = DictionaryDto.UniqueIdColumnName)] public Guid UniqueId { get; set; } [Column("value")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LastSyncedDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LastSyncedDto.cs index 15c25a5ed3aa..74c4c2dae402 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LastSyncedDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LastSyncedDto.cs @@ -1,4 +1,4 @@ -using NPoco; +using NPoco; using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations; using Constants = Umbraco.Cms.Core.Constants; @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("machineId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class LastSyncedDto { internal const string TableName = Constants.DatabaseSchema.Tables.LastSynced; + public const string PrimaryKeyColumnName = "machineId"; - [Column("machineId")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_lastSyncedMachineId", AutoIncrement = false, Clustered = true)] public required string MachineId { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LockDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LockDto.cs index c3015bfe8cc5..27f25091834a 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LockDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LockDto.cs @@ -4,12 +4,15 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; -[TableName(Constants.DatabaseSchema.Tables.Lock)] -[PrimaryKey("id", AutoIncrement = false)] +[TableName(TableName)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class LockDto { - [Column("id")] + public const string TableName = Constants.DatabaseSchema.Tables.Lock; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_umbracoLock", AutoIncrement = false)] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs index 3abc067dad26..c0b56fcf30f9 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs @@ -6,24 +6,29 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class LogDto { public const string TableName = Constants.DatabaseSchema.Tables.Log; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + private const string UserIdColumnName = "userId"; + private const string NodeIdColumnName = "NodeId"; + private const string DatestampColumnName = "Datestamp"; + private const string HeaderColumnName = "logHeader"; private int? _userId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("userId")] + [Column(UserIdColumnName)] [ForeignKey(typeof(UserDto))] [NullSetting(NullSetting = NullSettings.Null)] public int? UserId { get => _userId == 0 ? null : _userId; set => _userId = value; } // return null if zero - [Column("NodeId")] + [Column(NodeIdColumnName)] [Index(IndexTypes.NonClustered, Name = "IX_umbracoLog")] public int NodeId { get; set; } @@ -35,14 +40,14 @@ internal sealed class LogDto [NullSetting(NullSetting = NullSettings.Null)] public string? EntityType { get; set; } - [Column("Datestamp")] + [Column(DatestampColumnName)] [Constraint(Default = SystemMethods.CurrentUTCDateTime)] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_datestamp", ForColumns = "Datestamp,userId,NodeId")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_datestamp", ForColumns = $"{DatestampColumnName},{UserIdColumnName},{NodeIdColumnName}")] public DateTime Datestamp { get; set; } - [Column("logHeader")] + [Column(HeaderColumnName)] [Length(50)] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_datestamp_logheader", ForColumns = "Datestamp,logHeader")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_datestamp_logheader", ForColumns = $"{DatestampColumnName},{HeaderColumnName}")] public string Header { get; set; } = null!; [Column("logComment")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LogViewerQueryDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LogViewerQueryDto.cs index 24209968795b..b531201e02cd 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LogViewerQueryDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LogViewerQueryDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class LogViewerQueryDto { public const string TableName = Constants.DatabaseSchema.Tables.LogViewerQuery; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LongRunningOperationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LongRunningOperationDto.cs index 677eed7edaeb..42ae25c94706 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LongRunningOperationDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LongRunningOperationDto.cs @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal class LongRunningOperationDto { public const string TableName = Constants.DatabaseSchema.Tables.LongRunningOperation; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_umbracoLongRunningOperation", AutoIncrement = false)] public Guid Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/MediaDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MediaDto.cs index 6eedeca27e5e..bc3c43b3478a 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/MediaDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/MediaDto.cs @@ -10,7 +10,7 @@ internal sealed class MediaDto public int NodeId { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ReferenceMemberName = "NodeId")] + [Reference(ReferenceType.OneToOne, ReferenceMemberName = ContentDto.ReferenceMemberName)] public ContentDto ContentDto { get; set; } = null!; [ResultColumn] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/MediaVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MediaVersionDto.cs index fd47f17696cd..247e234025aa 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/MediaVersionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/MediaVersionDto.cs @@ -5,19 +5,22 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class MediaVersionDto { public const string TableName = Constants.DatabaseSchema.Tables.MediaVersion; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + private const string PathColumnName = "path"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] [ForeignKey(typeof(ContentVersionDto))] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName, ForColumns = "id, path")] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName, ForColumns = $"{PrimaryKeyColumnName}, {PathColumnName}")] public int Id { get; set; } - [Column("path")] + [Column(PathColumnName)] [NullSetting(NullSetting = NullSettings.Null)] public string? Path { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/Member2MemberGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/Member2MemberGroupDto.cs index 4925f2dd82c5..123db530aae4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/Member2MemberGroupDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/Member2MemberGroupDto.cs @@ -5,18 +5,21 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("Member", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class Member2MemberGroupDto { public const string TableName = Constants.DatabaseSchema.Tables.Member2MemberGroup; + public const string PrimaryKeyColumnName = "Member"; - [Column("Member")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsMember2MemberGroup", OnColumns = "Member, MemberGroup")] + private const string MemberGroupColumnName = "MemberGroup"; + + [Column(PrimaryKeyColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsMember2MemberGroup", OnColumns = $"{PrimaryKeyColumnName}, {MemberGroupColumnName}")] [ForeignKey(typeof(MemberDto))] public int Member { get; set; } - [Column("MemberGroup")] + [Column(MemberGroupColumnName)] [ForeignKey(typeof(NodeDto))] public int MemberGroup { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs index 98435f8ce082..de1f498a9a9f 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("nodeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class MemberDto { private const string TableName = Constants.DatabaseSchema.Tables.Member; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.NodeIdName; - [Column("nodeId")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] [ForeignKey(typeof(ContentDto))] public int NodeId { get; set; } @@ -75,10 +76,10 @@ internal sealed class MemberDto public DateTime? LastPasswordChangeDate { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ReferenceMemberName = "NodeId")] + [Reference(ReferenceType.OneToOne, ReferenceMemberName = ContentDto.ReferenceMemberName)] public ContentDto ContentDto { get; set; } = null!; [ResultColumn] - [Reference(ReferenceType.OneToOne, ReferenceMemberName = "NodeId")] + [Reference(ReferenceType.OneToOne, ReferenceMemberName = ContentVersionDto.ReferenceColumnName)] public ContentVersionDto ContentVersionDto { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/MemberPropertyTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberPropertyTypeDto.cs index e0487661aee8..be9a65f7be23 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/MemberPropertyTypeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberPropertyTypeDto.cs @@ -4,18 +4,22 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; -[TableName(Constants.DatabaseSchema.Tables.MemberPropertyType)] -[PrimaryKey("pk")] +[TableName(TableName)] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class MemberPropertyTypeDto { - [Column("pk")] + public const string TableName = Constants.DatabaseSchema.Tables.MemberPropertyType; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNamePk; + public const string NodeIdColumnName = "NodeId"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int PrimaryKey { get; set; } - [Column("NodeId")] + [Column(NodeIdColumnName)] [ForeignKey(typeof(NodeDto))] - [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] + [ForeignKey(typeof(ContentTypeDto), Column = ContentTypeDto.NodeIdColumnName)] public int NodeId { get; set; } [Column("propertytypeId")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs index 38e8e3627163..c8fc81dd5b41 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs @@ -6,19 +6,33 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] public class NodeDto { public const string TableName = Constants.DatabaseSchema.Tables.Node; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; public const int NodeIdSeed = 1060; // Public constants to bind properties between DTOs - public const string IdColumnName = "id"; - public const string KeyColumnName = "uniqueId"; + + /// + /// This actually represents NodeId but kept as Id for backward compatibility. + /// + public const string IdColumnName = PrimaryKeyColumnName; + + public const string KeyColumnName = Constants.DatabaseSchema.Columns.UniqueIdName; public const string ParentIdColumnName = "parentId"; public const string SortOrderColumnName = "sortOrder"; public const string TrashedColumnName = "trashed"; + public const string NodeObjectTypeColumnName = "nodeObjectType"; + public const string TextColumnName = "text"; + public const string PathColumnName = "path"; + public const string LevelColumnName = "level"; + public const string UserIdColumnName = "nodeUser"; + public const string CreateDateColumnName = "createDate"; + public const string UniqueIdColumnNameTypo = "uniqueID"; + private int? _userId; @@ -28,27 +42,27 @@ public class NodeDto [Column(KeyColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_UniqueId", IncludeColumns = "parentId,level,path,sortOrder,trashed,nodeUser,text,createDate")] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_UniqueId", IncludeColumns = $"{ParentIdColumnName},{LevelColumnName},{PathColumnName},{SortOrderColumnName},{TrashedColumnName},{UserIdColumnName},{TextColumnName},{CreateDateColumnName}")] [Constraint(Default = SystemMethods.NewGuid)] public Guid UniqueId { get; set; } [Column(ParentIdColumnName)] [ForeignKey(typeof(NodeDto))] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_parentId_nodeObjectType", ForColumns = "parentId,nodeObjectType", IncludeColumns = "trashed,nodeUser,level,path,sortOrder,uniqueID,text,createDate")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_parentId_nodeObjectType", ForColumns = $"{ParentIdColumnName},{NodeObjectTypeColumnName}", IncludeColumns = $"{TrashedColumnName},{UserIdColumnName},{LevelColumnName},{PathColumnName},{SortOrderColumnName},{UniqueIdColumnNameTypo},{TextColumnName},{CreateDateColumnName}")] public int ParentId { get; set; } // NOTE: This index is primarily for the nucache data lookup, see https://github.com/umbraco/Umbraco-CMS/pull/8365#issuecomment-673404177 - [Column("level")] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Level", ForColumns = "level,parentId,sortOrder,nodeObjectType,trashed", IncludeColumns = "nodeUser,path,uniqueId,createDate")] + [Column(LevelColumnName)] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Level", ForColumns = $"{LevelColumnName},{ParentIdColumnName},{SortOrderColumnName},{NodeObjectTypeColumnName},{TrashedColumnName}", IncludeColumns = $"{UserIdColumnName},{PathColumnName},{KeyColumnName},{CreateDateColumnName}")] public short Level { get; set; } - [Column("path")] + [Column(PathColumnName)] [Length(150)] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Path")] public string Path { get; set; } = null!; [Column(SortOrderColumnName)] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_ObjectType_trashed_sorted", ForColumns = "nodeObjectType,trashed,sortOrder,id", IncludeColumns = "uniqueID,parentId,level,path,nodeUser,text,createDate")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_ObjectType_trashed_sorted", ForColumns = $"{NodeObjectTypeColumnName},{TrashedColumnName},{SortOrderColumnName},{IdColumnName}", IncludeColumns = $"{UniqueIdColumnNameTypo},{ParentIdColumnName},{LevelColumnName},{PathColumnName},{UserIdColumnName},{TextColumnName},{CreateDateColumnName}")] public int SortOrder { get; set; } [Column(TrashedColumnName)] @@ -56,21 +70,21 @@ public class NodeDto [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Trashed")] public bool Trashed { get; set; } - [Column("nodeUser")] // TODO: db rename to 'createUserId' + [Column(UserIdColumnName)] // TODO: db rename to 'createUserId' [ForeignKey(typeof(UserDto))] [NullSetting(NullSetting = NullSettings.Null)] public int? UserId { get => _userId == 0 ? null : _userId; set => _userId = value; } // return null if zero - [Column("text")] + [Column(TextColumnName)] [NullSetting(NullSetting = NullSettings.Null)] public string? Text { get; set; } - [Column("nodeObjectType")] // TODO: db rename to 'objectType' + [Column(NodeObjectTypeColumnName)] // TODO: db rename to 'objectType' [NullSetting(NullSetting = NullSettings.Null)] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_ObjectType", ForColumns = "nodeObjectType,trashed", IncludeColumns = "uniqueId,parentId,level,path,sortOrder,nodeUser,text,createDate")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_ObjectType", ForColumns = $"{NodeObjectTypeColumnName},{TrashedColumnName}", IncludeColumns = $"{UniqueIdColumnNameTypo},{ParentIdColumnName},{LevelColumnName},{PathColumnName},{SortOrderColumnName},{UserIdColumnName},{TextColumnName},{CreateDateColumnName}")] public Guid? NodeObjectType { get; set; } - [Column("createDate")] + [Column(CreateDateColumnName)] [Constraint(Default = SystemMethods.CurrentUTCDateTime)] public DateTime CreateDate { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyDataDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyDataDto.cs index d824edc645ee..e048b9d91943 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyDataDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyDataDto.cs @@ -6,38 +6,46 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class PropertyDataDto { public const string TableName = Constants.DatabaseSchema.Tables.PropertyData; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string PropertyTypeIdColumnName = "propertyTypeId"; + public const string VersionIdColumnName = "versionId"; public const int VarcharLength = 512; public const int SegmentLength = 256; + internal const string ReferenceColumnName = "PropertyTypeId"; // should be PropertyTypeId, but for database compatibility we keep it like this + + private const string LanguageIdColumnName = "languageId"; + private const string SegmentColumnName = "segment"; + private decimal? _decimalValue; // pk, not used at the moment (never updating) - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("versionId")] + [Column(VersionIdColumnName)] [ForeignKey(typeof(ContentVersionDto))] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_VersionId", ForColumns = "versionId,propertyTypeId,languageId,segment")] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_" + TableName + "_VersionId", ForColumns = $"{VersionIdColumnName},{PropertyTypeIdColumnName},{LanguageIdColumnName},{SegmentColumnName}")] public int VersionId { get; set; } - [Column("propertyTypeId")] + [Column(PropertyTypeIdColumnName)] [ForeignKey(typeof(PropertyTypeDto))] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_PropertyTypeId")] public int PropertyTypeId { get; set; } - [Column("languageId")] + [Column(LanguageIdColumnName)] [ForeignKey(typeof(LanguageDto))] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_LanguageId")] [NullSetting(NullSetting = NullSettings.Null)] public int? LanguageId { get; set; } - [Column("segment")] + [Column(SegmentColumnName)] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_Segment")] [NullSetting(NullSetting = NullSettings.Null)] [Length(SegmentLength)] @@ -70,7 +78,7 @@ public decimal? DecimalValue public string? TextValue { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "PropertyTypeId")] + [Reference(ReferenceType.OneToOne, ColumnName = ReferenceColumnName)] public PropertyTypeDto? PropertyTypeDto { get; set; } [Ignore] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeDto.cs index 2913e20c7c24..ce78ef03b828 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeDto.cs @@ -6,27 +6,34 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal class PropertyTypeDto { public const string TableName = Constants.DatabaseSchema.Tables.PropertyType; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string PropertyTypeGroupIdColumnName = "propertyTypeGroupId"; + public const string DataTypeIdColumnName = "dataTypeId"; + public const string ContentTypeIdColumnName = "contentTypeId"; + + internal const string ReferenceColumnName = "DataTypeId"; // should be DataTypeIdColumnName, but for database compatibility we keep it like this + internal const string ReferencePropertyTypeGroupIdColumnName = "PropertyTypeGroupId"; // should be PropertyTypeGroupIdColumnName, but for database compatibility we keep it like this private string? _alias; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(IdentitySeed = 100)] public int Id { get; set; } - [Column("dataTypeId")] - [ForeignKey(typeof(DataTypeDto), Column = "nodeId")] + [Column(DataTypeIdColumnName)] + [ForeignKey(typeof(DataTypeDto), Column = DataTypeDto.PrimaryKeyColumnName)] public int DataTypeId { get; set; } - [Column("contentTypeId")] - [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] + [Column(ContentTypeIdColumnName)] + [ForeignKey(typeof(ContentTypeDto), Column = ContentTypeDto.NodeIdColumnName)] public int ContentTypeId { get; set; } - [Column("propertyTypeGroupId")] + [Column(PropertyTypeGroupIdColumnName)] [NullSetting(NullSetting = NullSettings.Null)] [ForeignKey(typeof(PropertyTypeGroupDto))] public int? PropertyTypeGroupId { get; set; } @@ -76,7 +83,7 @@ internal class PropertyTypeDto public byte Variations { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "DataTypeId")] + [Reference(ReferenceType.OneToOne, ColumnName = ReferenceColumnName)] public DataTypeDto DataTypeDto { get; set; } = null!; [Column("UniqueId")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupDto.cs index b9fcadd0739d..883d65b17943 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupDto.cs @@ -6,24 +6,27 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] internal sealed class PropertyTypeGroupDto { public const string TableName = Constants.DatabaseSchema.Tables.PropertyTypeGroup; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string ContentTypeNodeIdColumnName = "contenttypeNodeId"; + public const string UniqueIdColumnName = "uniqueID"; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(IdentitySeed = 56)] public int Id { get; set; } - [Column("uniqueID")] + [Column(UniqueIdColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] [Constraint(Default = SystemMethods.NewGuid)] [Index(IndexTypes.UniqueNonClustered, Name = "IX_cmsPropertyTypeGroupUniqueID")] public Guid UniqueId { get; set; } - [Column("contenttypeNodeId")] - [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] + [Column(ContentTypeNodeIdColumnName)] + [ForeignKey(typeof(ContentTypeDto), Column = ContentTypeDto.NodeIdColumnName)] public int ContentTypeNodeId { get; set; } [Column("type")] @@ -40,6 +43,6 @@ internal sealed class PropertyTypeGroupDto public int SortOrder { get; set; } [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = "PropertyTypeGroupId")] + [Reference(ReferenceType.Many, ReferenceMemberName = PropertyTypeDto.ReferencePropertyTypeGroupIdColumnName)] public List PropertyTypeDtos { get; set; } = []; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs index 3269102562e9..6f7172a0284c 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs @@ -3,14 +3,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; +[Obsolete("This class is unused in Umbraco. Scheduled for removal in Umbraco 19.")] [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] internal sealed class PropertyTypeGroupReadOnlyDto { public const string TableName = Constants.DatabaseSchema.Tables.PropertyTypeGroup; + public const string PrimaryKeyColumnName = "PropertyTypeGroupId"; - [Column("PropertyTypeGroupId")] + [Column(PrimaryKeyColumnName)] public int? Id { get; set; } [Column("PropertyGroupName")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeReadOnlyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeReadOnlyDto.cs index 4c4e526693d1..2c9a5a02f227 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeReadOnlyDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeReadOnlyDto.cs @@ -3,14 +3,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; +[Obsolete("This class is unused in Umbraco. Scheduled for removal in Umbraco 19.")] [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class PropertyTypeReadOnlyDto { public const string TableName = Constants.DatabaseSchema.Tables.PropertyType; + public const string PrimaryKeyColumnName = "PropertyTypeId"; - [Column("PropertyTypeId")] + [Column(PrimaryKeyColumnName)] public int? Id { get; set; } [Column("dataTypeId")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/RedirectUrlDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RedirectUrlDto.cs index e5af86072150..060fb14e87dd 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/RedirectUrlDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/RedirectUrlDto.cs @@ -5,11 +5,18 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class RedirectUrlDto { public const string TableName = Constants.DatabaseSchema.Tables.RedirectUrl; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + + private const string ContentKeyColumnName = "contentKey"; + private const string CreateDateUtcColumnName = "createDateUtc"; + private const string UrlColumnName = "url"; + private const string CultureColumnName = "culture"; + private const string UrlHashColumnName = "urlHash"; public RedirectUrlDto() => CreateDateUtc = DateTime.UtcNow; @@ -19,35 +26,35 @@ internal sealed class RedirectUrlDto // problem is that the index key must be 900 bytes max. should we run without an index? done // some perfs comparisons, and running with an index on a hash is only slightly slower on // inserts, and much faster on reads, so... we have an index on a hash. - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_umbracoRedirectUrl", AutoIncrement = false)] public Guid Id { get; set; } [ResultColumn] public int ContentId { get; set; } - [Column("contentKey")] + [Column(ContentKeyColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] - [ForeignKey(typeof(NodeDto), Column = "uniqueId")] + [ForeignKey(typeof(NodeDto), Column = NodeDto.KeyColumnName)] public Guid ContentKey { get; set; } - [Column("createDateUtc")] + [Column(CreateDateUtcColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_culture_hash", ForColumns = "createDateUtc", IncludeColumns = "culture,url,urlHash,contentKey")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_culture_hash", ForColumns = CreateDateUtcColumnName, IncludeColumns = $"{CultureColumnName},{UrlColumnName},{UrlHashColumnName},{ContentKeyColumnName}")] public DateTime CreateDateUtc { get; set; } - [Column("url")] + [Column(UrlColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] [SpecialDbType(SpecialDbTypes.NVARCHARMAX)] public string Url { get; set; } = null!; - [Column("culture")] + [Column(CultureColumnName)] [NullSetting(NullSetting = NullSettings.Null)] public string? Culture { get; set; } - [Column("urlHash")] + [Column(UrlHashColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRedirectUrl", ForColumns = "urlHash, contentKey, culture, createDateUtc")] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRedirectUrl", ForColumns = $"{UrlHashColumnName}, {ContentKeyColumnName}, {CultureColumnName}, {CreateDateUtcColumnName}")] [Length(40)] public string UrlHash { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs index 5c15ca53fd9a..b14c249d9271 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs @@ -6,26 +6,31 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class RelationDto { public const string TableName = Constants.DatabaseSchema.Tables.Relation; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + private const string RelationTypeColumnName = "relType"; + private const string ParentIdColumnName = "parentId"; + private const string ChildIdColumnName = "childId"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("parentId")] + [Column(ParentIdColumnName)] [ForeignKey(typeof(NodeDto), Name = "FK_umbracoRelation_umbracoNode")] - [Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRelation_parentChildType", ForColumns = "parentId,childId,relType")] + [Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRelation_parentChildType", ForColumns = $"{ParentIdColumnName},{ChildIdColumnName},{RelationTypeColumnName}")] public int ParentId { get; set; } - [Column("childId")] + [Column(ChildIdColumnName)] [ForeignKey(typeof(NodeDto), Name = "FK_umbracoRelation_umbracoNode1")] public int ChildId { get; set; } - [Column("relType")] + [Column(RelationTypeColumnName)] [ForeignKey(typeof(RelationTypeDto))] public int RelationType { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/RelationTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationTypeDto.cs index 20a43410b62f..16dc1af1fe28 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/RelationTypeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationTypeDto.cs @@ -5,15 +5,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class RelationTypeDto { public const string TableName = Constants.DatabaseSchema.Tables.RelationType; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; public const int NodeIdSeed = 10; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(IdentitySeed = NodeIdSeed)] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/RepositoryCacheVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RepositoryCacheVersionDto.cs index a06fceed9a5a..f83965511981 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/RepositoryCacheVersionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/RepositoryCacheVersionDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("identifier", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class RepositoryCacheVersionDto { internal const string TableName = Constants.DatabaseSchema.Tables.RepositoryCacheVersion; + public const string PrimaryKeyColumnName = "identifier"; - [Column("identifier")] + [Column(PrimaryKeyColumnName)] [Length(256)] [PrimaryKeyColumn(Name = "PK_umbracoRepositoryCacheVersion", AutoIncrement = false, Clustered = true)] public required string Identifier { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs index 960697cf723a..7d37c68a9045 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class ServerRegistrationDto { public const string TableName = Constants.DatabaseSchema.Tables.Server; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = true)] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/TagDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/TagDto.cs index 628b08974c8f..5f037fd292db 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/TagDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/TagDto.cs @@ -5,30 +5,35 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class TagDto { public const string TableName = Constants.DatabaseSchema.Tables.Tag; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + private const string LanguageIdColumnName = "languageId"; + private const string GroupColumnName = "group"; + private const string TextColumnName = "tag"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("group")] + [Column(GroupColumnName)] [Length(100)] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_languageId_group", ForColumns = "languageId,group", IncludeColumns = "id,tag")] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_languageId_group", ForColumns = $"{LanguageIdColumnName},{GroupColumnName}", IncludeColumns = $"{PrimaryKeyColumnName},{TextColumnName}")] public string Group { get; set; } = null!; - [Column("languageId")] + [Column(LanguageIdColumnName)] [ForeignKey(typeof(LanguageDto))] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_LanguageId")] [NullSetting(NullSetting = NullSettings.Null)] public int? LanguageId { get; set; } - [Column("tag")] + [Column(TextColumnName)] [Length(200)] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "group,tag,languageId", Name = "IX_cmsTags")] + [Index(IndexTypes.UniqueNonClustered, ForColumns = $"{GroupColumnName},{TextColumnName},{LanguageIdColumnName}", Name = "IX_cmsTags")] public string Text { get; set; } = null!; // [Column("key")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/TagRelationshipDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/TagRelationshipDto.cs index 627435b9632c..1d1e7a5892e4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/TagRelationshipDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/TagRelationshipDto.cs @@ -5,23 +5,26 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("nodeId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class TagRelationshipDto { public const string TableName = Constants.DatabaseSchema.Tables.TagRelationship; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.NodeIdName; + public const string PropertyTypeIdColumnName = "propertyTypeId"; + public const string TagIdColumnName = "tagId"; - [Column("nodeId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsTagRelationship", OnColumns = "nodeId, propertyTypeId, tagId")] - [ForeignKey(typeof(ContentDto), Name = "FK_cmsTagRelationship_cmsContent", Column = "nodeId")] - [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_tagId_nodeId", ForColumns = "tagId,nodeId", IncludeColumns = "propertyTypeId")] + [Column(PrimaryKeyColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsTagRelationship", OnColumns = $"{PrimaryKeyColumnName}, {PropertyTypeIdColumnName}, {TagIdColumnName}")] + [ForeignKey(typeof(ContentDto), Name = "FK_cmsTagRelationship_cmsContent", Column = ContentDto.PrimaryKeyColumnName)] + [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_tagId_nodeId", ForColumns = $"{TagIdColumnName},{PrimaryKeyColumnName}", IncludeColumns = PropertyTypeIdColumnName)] public int NodeId { get; set; } - [Column("tagId")] + [Column(TagIdColumnName)] [ForeignKey(typeof(TagDto))] public int TagId { get; set; } - [Column("propertyTypeId")] + [Column(PropertyTypeIdColumnName)] [ForeignKey(typeof(PropertyTypeDto), Name = "FK_cmsTagRelationship_cmsPropertyType")] public int PropertyTypeId { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/TemplateDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/TemplateDto.cs index e1462a47fade..cbf127191aa3 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/TemplateDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/TemplateDto.cs @@ -5,17 +5,21 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("pk")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] internal sealed class TemplateDto { public const string TableName = Constants.DatabaseSchema.Tables.Template; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNamePk; + public const string NodeIdColumnName = Constants.DatabaseSchema.Columns.NodeIdName; - [Column("pk")] + internal const string ReferenceColumnName = "NodeId"; // should be NodeIdColumnName, but for database compatibility we keep it like this + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int PrimaryKey { get; set; } - [Column("nodeId")] + [Column(NodeIdColumnName)] [Index(IndexTypes.UniqueNonClustered)] [ForeignKey(typeof(NodeDto), Name = "FK_cmsTemplate_umbracoNode")] public int NodeId { get; set; } @@ -26,6 +30,6 @@ internal sealed class TemplateDto public string? Alias { get; set; } [ResultColumn] - [Reference(ReferenceType.OneToOne, ColumnName = "NodeId")] + [Reference(ReferenceType.OneToOne, ColumnName = ReferenceColumnName)] public NodeDto NodeDto { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/TwoFactorLoginDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/TwoFactorLoginDto.cs index f40231cb6d12..cb7985697117 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/TwoFactorLoginDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/TwoFactorLoginDto.cs @@ -6,23 +6,27 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] [ExplicitColumns] -[PrimaryKey("Id")] +[PrimaryKey(PrimaryKeyColumnName)] internal sealed class TwoFactorLoginDto { public const string TableName = Constants.DatabaseSchema.Tables.TwoFactorLogin; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + private const string UserOrMemberKeyColumnName = "userOrMemberKey"; + private const string ProviderNameColumnName = "providerName"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn] public int Id { get; set; } - [Column("userOrMemberKey")] + [Column(UserOrMemberKeyColumnName)] [Index(IndexTypes.NonClustered)] public Guid UserOrMemberKey { get; set; } - [Column("providerName")] + [Column(ProviderNameColumnName)] [Length(400)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "providerName,userOrMemberKey", Name = "IX_" + TableName + "_ProviderName")] + [Index(IndexTypes.UniqueNonClustered, ForColumns = $"{ProviderNameColumnName},{UserOrMemberKeyColumnName}", Name = "IX_" + TableName + "_ProviderName")] public string ProviderName { get; set; } = null!; [Column("secret")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/User2ClientIdDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/User2ClientIdDto.cs index 9d433fb70a0b..ca1f49e9d861 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/User2ClientIdDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/User2ClientIdDto.cs @@ -5,18 +5,21 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("userId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class User2ClientIdDto { public const string TableName = Constants.DatabaseSchema.Tables.User2ClientId; + public const string PrimaryKeyColumnName = "userId"; - [Column("userId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUser2ClientId", OnColumns = "userId, clientId")] + private const string ClientIdColumnName = "clientId"; + + [Column(PrimaryKeyColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUser2ClientId", OnColumns = $"{PrimaryKeyColumnName}, {ClientIdColumnName}")] [ForeignKey(typeof(UserDto))] public int UserId { get; set; } - [Column("clientId")] + [Column(ClientIdColumnName)] [Length(255)] public string? ClientId { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/User2NodeNotifyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/User2NodeNotifyDto.cs index e980230d7ff0..7eb08f636d7f 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/User2NodeNotifyDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/User2NodeNotifyDto.cs @@ -5,22 +5,25 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("userId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class User2NodeNotifyDto { public const string TableName = Constants.DatabaseSchema.Tables.User2NodeNotify; + public const string PrimaryKeyColumnName = "userId"; + public const string NodeIdColumnName = Constants.DatabaseSchema.Columns.NodeIdName; + public const string ActionColumnName = "action"; - [Column("userId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUser2NodeNotify", OnColumns = "userId, nodeId, action")] + [Column(PrimaryKeyColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUser2NodeNotify", OnColumns = $"{PrimaryKeyColumnName}, {NodeIdColumnName}, {ActionColumnName}")] [ForeignKey(typeof(UserDto))] public int UserId { get; set; } - [Column("nodeId")] + [Column(NodeIdColumnName)] [ForeignKey(typeof(NodeDto))] public int NodeId { get; set; } - [Column("action")] + [Column(ActionColumnName)] [Length(255)] public string? Action { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/User2UserGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/User2UserGroupDto.cs index fd0da99f3981..89869377c839 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/User2UserGroupDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/User2UserGroupDto.cs @@ -10,12 +10,15 @@ public class User2UserGroupDto { public const string TableName = Constants.DatabaseSchema.Tables.User2UserGroup; - [Column("userId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_user2userGroup", OnColumns = "userId, userGroupId")] + private const string UserIdColumnName = "userId"; + private const string UserGroupIdColumnName = "userGroupId"; + + [Column(UserIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_user2userGroup", OnColumns = $"{UserIdColumnName}, {UserGroupIdColumnName}")] [ForeignKey(typeof(UserDto))] public int UserId { get; set; } - [Column("userGroupId")] + [Column(UserGroupIdColumnName)] [ForeignKey(typeof(UserGroupDto))] public int UserGroupId { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDataDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDataDto.cs index d04da681cfa1..34ea0220d996 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDataDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDataDto.cs @@ -6,27 +6,32 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("key", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class UserDataDto { public const string TableName = Constants.DatabaseSchema.Tables.UserData; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameKey; - [Column("key")] + private const string UserKeyColumnName = "userKey"; + private const string GroupColumnName = "group"; + private const string IdentifierColumnName = "identifier"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_umbracoUserDataDto", AutoIncrement = false)] public Guid Key { get; set; } - [Column("userKey")] + [Column(UserKeyColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.NonClustered, Name = "IX_umbracoUserDataDto_UserKey_Group_Identifier", IncludeColumns = "group,identifier")] - [ForeignKey(typeof(UserDto), Column = "key")] + [Index(IndexTypes.NonClustered, Name = "IX_umbracoUserDataDto_UserKey_Group_Identifier", IncludeColumns = $"{GroupColumnName},{IdentifierColumnName}")] + [ForeignKey(typeof(UserDto), Column = UserDto.KeyColumnName)] public Guid UserKey { get; set; } - [Column("group")] + [Column(GroupColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] public required string Group { get; set; } - [Column("identifier")] + [Column(IdentifierColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] public required string Identifier { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs index abc655c3db64..193811ca11dc 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs @@ -6,11 +6,15 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] public class UserDto { public const string TableName = Constants.DatabaseSchema.Tables.User; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string KeyColumnName = "key"; + + private const string ReferenceMemberColumnName = "UserId"; public UserDto() { @@ -18,7 +22,7 @@ public UserDto() UserStartNodeDtos = new HashSet(); } - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_user")] public int Id { get; set; } @@ -26,7 +30,7 @@ public UserDto() [Constraint(Default = "0")] public bool Disabled { get; set; } - [Column("key")] + [Column(KeyColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] [Constraint(Default = SystemMethods.NewGuid)] [Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoUser_userKey")] @@ -117,10 +121,10 @@ public UserDto() public string? Avatar { get; set; } [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = "UserId")] + [Reference(ReferenceType.Many, ReferenceMemberName = ReferenceMemberColumnName)] public List UserGroupDtos { get; set; } [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = "UserId")] + [Reference(ReferenceType.Many, ReferenceMemberName = ReferenceMemberColumnName)] public HashSet UserStartNodeDtos { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs index 4b71e1b7147a..16f67224a2a9 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs @@ -5,18 +5,23 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] public class UserGroup2AppDto { public const string TableName = Constants.DatabaseSchema.Tables.UserGroup2App; + public const string PrimaryKeyColumnName = "userGroupId"; - [Column("userGroupId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_userGroup2App", OnColumns = "userGroupId, app")] + internal const string ReferenceMemberName = "UserGroupId"; // should be PrimaryKeyColumnName, but for database compatibility we keep it like this + + private const string AppAliasColumnName = "app"; + + [Column(PrimaryKeyColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_userGroup2App", OnColumns = $"{PrimaryKeyColumnName}, {AppAliasColumnName}")] [ForeignKey(typeof(UserGroupDto))] public int UserGroupId { get; set; } - [Column("app")] + [Column(AppAliasColumnName)] [Length(50)] public string AppAlias { get; set; } = null!; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2GranularPermissionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2GranularPermissionDto.cs index e1cfc16380ba..5d2471d4482a 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2GranularPermissionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2GranularPermissionDto.cs @@ -5,23 +5,25 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] public class UserGroup2GranularPermissionDto { public const string TableName = Constants.DatabaseSchema.Tables.UserGroup2GranularPermission; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string UniqueIdColumnName = Constants.DatabaseSchema.Columns.UniqueIdName; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_umbracoUserGroup2GranularPermissionDto", AutoIncrement = true)] public int Id { get; set; } [Column("userGroupKey")] - [Index(IndexTypes.NonClustered, Name = "IX_umbracoUserGroup2GranularPermissionDto_UserGroupKey_UniqueId", IncludeColumns = "uniqueId")] - [ForeignKey(typeof(UserGroupDto), Column = "key")] + [Index(IndexTypes.NonClustered, Name = "IX_umbracoUserGroup2GranularPermissionDto_UserGroupKey_UniqueId", IncludeColumns = UniqueIdColumnName)] + [ForeignKey(typeof(UserGroupDto), Column = UserGroupDto.KeyColumnName)] public Guid UserGroupKey { get; set; } - [Column("uniqueId")] - [ForeignKey(typeof(NodeDto), Column = "uniqueId")] + [Column(UniqueIdColumnName)] + [ForeignKey(typeof(NodeDto), Column = UniqueIdColumnName)] [NullSetting(NullSetting = NullSettings.Null)] [Index(IndexTypes.NonClustered, Name = "IX_umbracoUserGroup2GranularPermissionDto_UniqueId")] public Guid? UniqueId { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2LanguageDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2LanguageDto.cs index 36ba42bb4ec8..5d5b679094e8 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2LanguageDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2LanguageDto.cs @@ -10,12 +10,17 @@ public class UserGroup2LanguageDto { public const string TableName = Cms.Core.Constants.DatabaseSchema.Tables.UserGroup2Language; - [Column("userGroupId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_userGroup2language", OnColumns = "userGroupId, languageId")] + internal const string ReferenceMemberName = "UserGroupId"; // should be UserGroupIdColumnName, but for database compatibility we keep it like this + + private const string UserGroupIdColumnName = "userGroupId"; + private const string LanguageIdColumnName = "languageId"; + + [Column(UserGroupIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_userGroup2language", OnColumns = $"{UserGroupIdColumnName}, {LanguageIdColumnName}")] [ForeignKey(typeof(UserGroupDto), OnDelete = Rule.Cascade)] public int UserGroupId { get; set; } - [Column("languageId")] + [Column(LanguageIdColumnName)] [ForeignKey(typeof(LanguageDto), OnDelete = Rule.Cascade)] public int LanguageId { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodeDto.cs index afc21fb6f04d..772d7ac4707b 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodeDto.cs @@ -11,12 +11,15 @@ internal sealed class UserGroup2NodeDto { public const string TableName = Constants.DatabaseSchema.Tables.UserGroup2Node; - [Column("userGroupId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_" + TableName, OnColumns = "userGroupId, nodeId")] + private const string UserGroupIdColumnName = "userGroupId"; + private const string NodeIdColumnName = "nodeId"; + + [Column(UserGroupIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_" + TableName, OnColumns = $"{UserGroupIdColumnName}, {NodeIdColumnName}")] [ForeignKey(typeof(UserGroupDto))] public int UserGroupId { get; set; } - [Column("nodeId")] + [Column(NodeIdColumnName)] [ForeignKey(typeof(NodeDto))] [Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_nodeId")] public int NodeId { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodePermissionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodePermissionDto.cs index d6c14c432b36..2c0e43e65598 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodePermissionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodePermissionDto.cs @@ -9,16 +9,20 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [ExplicitColumns] internal class UserGroup2NodePermissionDto { - [Column("userGroupId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUserGroup2NodePermission", OnColumns = "userGroupId, nodeId, permission")] + private const string UserGroupIdColumnName = "userGroupId"; + private const string NodeIdColumnName = "nodeId"; + private const string PermissionColumnName = "permission"; + + [Column(UserGroupIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUserGroup2NodePermission", OnColumns = $"{UserGroupIdColumnName}, {NodeIdColumnName}, {PermissionColumnName}")] [ForeignKey(typeof(UserGroupDto))] public int UserGroupId { get; set; } - [Column("nodeId")] + [Column(NodeIdColumnName)] [ForeignKey(typeof(NodeDto))] [Index(IndexTypes.NonClustered, Name = "IX_umbracoUser2NodePermission_nodeId")] public int NodeId { get; set; } - [Column("permission")] + [Column(PermissionColumnName)] public string? Permission { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2PermissionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2PermissionDto.cs index ac095e6e4276..13a11ac12f99 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2PermissionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2PermissionDto.cs @@ -5,22 +5,25 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] public class UserGroup2PermissionDto { public const string TableName = Constants.DatabaseSchema.Tables.UserGroup2Permission; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + private const string PermissionColumnName = "permission"; + + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_userGroup2Permission", AutoIncrement = true)] public int Id { get; set; } [Column("userGroupKey")] - [Index(IndexTypes.NonClustered, IncludeColumns = "permission")] - [ForeignKey(typeof(UserGroupDto), Column = "key")] + [Index(IndexTypes.NonClustered, IncludeColumns = PermissionColumnName)] + [ForeignKey(typeof(UserGroupDto), Column = UserGroupDto.KeyColumnName)] public Guid UserGroupKey { get; set; } - [Column("permission")] + [Column(PermissionColumnName)] [Length(255)] public required string Permission { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs index 049c3fc940a9..2fbf11fc69af 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs @@ -6,11 +6,13 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id")] +[PrimaryKey(PrimaryKeyColumnName)] [ExplicitColumns] public class UserGroupDto { public const string TableName = Constants.DatabaseSchema.Tables.UserGroup; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + public const string KeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameKey; public UserGroupDto() { @@ -20,11 +22,11 @@ public UserGroupDto() UserGroup2GranularPermissionDtos = new List(); } - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(IdentitySeed = 6)] public int Id { get; set; } - [Column("key")] + [Column(KeyColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] [Constraint(Default = SystemMethods.NewGuid)] [Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoUserGroup_userGroupKey")] @@ -80,11 +82,11 @@ public UserGroupDto() public int? StartMediaId { get; set; } [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = "UserGroupId")] + [Reference(ReferenceType.Many, ReferenceMemberName = UserGroup2AppDto.ReferenceMemberName)] public List UserGroup2AppDtos { get; set; } [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = "UserGroupId")] + [Reference(ReferenceType.Many, ReferenceMemberName = UserGroup2LanguageDto.ReferenceMemberName)] public List UserGroup2LanguageDtos { get; set; } [ResultColumn] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserLoginDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserLoginDto.cs index 6b7705e6b53b..f0ce1e9f43de 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserLoginDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserLoginDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("sessionId", AutoIncrement = false)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = false)] [ExplicitColumns] internal sealed class UserLoginDto { public const string TableName = Constants.DatabaseSchema.Tables.UserLogin; + public const string PrimaryKeyColumnName = "sessionId"; - [Column("sessionId")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = false)] public Guid SessionId { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserStartNodeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserStartNodeDto.cs index 51ca08b84209..9b3ea6daad55 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserStartNodeDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserStartNodeDto.cs @@ -5,11 +5,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] public class UserStartNodeDto : IEquatable { public const string TableName = Constants.DatabaseSchema.Tables.UserStartNode; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; + + private const string UserIdColumnName = "userId"; + private const string StartNodeColumnName = "startNode"; + private const string StartNodeTypeColumnName = "startNodeType"; public enum StartNodeTypeValue { @@ -17,23 +22,23 @@ public enum StartNodeTypeValue Media = 2, } - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(Name = "PK_userStartNode")] public int Id { get; set; } - [Column("userId")] + [Column(UserIdColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] [ForeignKey(typeof(UserDto))] public int UserId { get; set; } - [Column("startNode")] + [Column(StartNodeColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] [ForeignKey(typeof(NodeDto))] public int StartNode { get; set; } - [Column("startNodeType")] + [Column(StartNodeTypeColumnName)] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "startNodeType, startNode, userId", Name = "IX_umbracoUserStartNode_startNodeType")] + [Index(IndexTypes.UniqueNonClustered, ForColumns = $"{StartNodeTypeColumnName}, {StartNodeColumnName}, {UserIdColumnName}", Name = "IX_umbracoUserStartNode_startNodeType")] public int StartNodeType { get; set; } public static bool operator ==(UserStartNodeDto left, UserStartNodeDto right) => Equals(left, right); diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2ContentTypeKeysDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2ContentTypeKeysDto.cs index 71bbed5962fb..5e9746f911a5 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2ContentTypeKeysDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2ContentTypeKeysDto.cs @@ -1,4 +1,4 @@ -using System.Data; +using System.Data; using NPoco; using Umbraco.Cms.Core; using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations; @@ -10,11 +10,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [ExplicitColumns] public class Webhook2ContentTypeKeysDto { - [Column("webhookId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_webhookEntityKey2Webhook", OnColumns = "webhookId, entityKey")] + internal const string ReferenceMemberName = "WebhookId"; // should be WebhookIdColumnName, but for database compatibility we keep it like this + + private const string WebhookIdColumnName = "webhookId"; + private const string ContentTypeKeyColumnName = "entityKey"; + + [Column(WebhookIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_webhookEntityKey2Webhook", OnColumns = $"{WebhookIdColumnName}, {ContentTypeKeyColumnName}")] [ForeignKey(typeof(WebhookDto), OnDelete = Rule.Cascade)] public int WebhookId { get; set; } - [Column("entityKey")] + [Column(ContentTypeKeyColumnName)] public Guid ContentTypeKey { get; set; } } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2EventsDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2EventsDto.cs index d534cf4c36e3..7bb8c0a44c2e 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2EventsDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2EventsDto.cs @@ -10,11 +10,16 @@ public class Webhook2EventsDto { public const string TableName = Constants.DatabaseSchema.Tables.Webhook2Events; - [Column("webhookId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_webhookEvent2WebhookDto", OnColumns = "webhookId, event")] + internal const string ReferenceMemberName = "WebhookId"; // should be WebhookIdColumnName, but for database compatibility we keep it like this + + private const string WebhookIdColumnName = "webhookId"; + private const string EventColumnName = "event"; + + [Column(WebhookIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_webhookEvent2WebhookDto", OnColumns = $"{WebhookIdColumnName}, {EventColumnName}")] [ForeignKey(typeof(WebhookDto), OnDelete = Rule.Cascade)] public int WebhookId { get; set; } - [Column("event")] + [Column(EventColumnName)] public string Event { get; set; } = string.Empty; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2HeadersDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2HeadersDto.cs index 85d039522280..4f126504dc91 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2HeadersDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/Webhook2HeadersDto.cs @@ -10,14 +10,20 @@ public class Webhook2HeadersDto { public const string TableName = Constants.DatabaseSchema.Tables.Webhook2Headers; - [Column("webhookId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_headers2WebhookDto", OnColumns = "webhookId, key")] + internal const string ReferenceMemberName = "WebhookId"; // should be WebhookIdColumnName, but for database compatibility we keep it like this + + private const string WebhookIdColumnName = "webhookId"; + private const string KeyColumnName = "Key"; + private const string ValueColumnName = "Value"; + + [Column(WebhookIdColumnName)] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_headers2WebhookDto", OnColumns = $"{WebhookIdColumnName}, {KeyColumnName}")] [ForeignKey(typeof(WebhookDto), OnDelete = Rule.Cascade)] public int WebhookId { get; set; } - [Column("Key")] + [Column(KeyColumnName)] public string Key { get; set; } = string.Empty; - [Column("Value")] + [Column(ValueColumnName)] public string Value { get; set; } = string.Empty; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookDto.cs index 122a70c28800..5c7dd0deba02 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookDto.cs @@ -6,13 +6,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] internal sealed class WebhookDto { public const string TableName = Constants.DatabaseSchema.Tables.Webhook; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = true)] public int Id { get; set; } @@ -38,15 +39,15 @@ internal sealed class WebhookDto public bool Enabled { get; set; } [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = nameof(Webhook2EventsDto.WebhookId))] + [Reference(ReferenceType.Many, ReferenceMemberName = Webhook2EventsDto.ReferenceMemberName)] public List Webhook2Events { get; set; } = new(); [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = nameof(Webhook2ContentTypeKeysDto.WebhookId))] + [Reference(ReferenceType.Many, ReferenceMemberName = Webhook2ContentTypeKeysDto.ReferenceMemberName)] public List Webhook2ContentTypeKeys { get; set; } = new(); [ResultColumn] - [Reference(ReferenceType.Many, ReferenceMemberName = nameof(Webhook2HeadersDto.WebhookId))] + [Reference(ReferenceType.Many, ReferenceMemberName = Webhook2HeadersDto.ReferenceMemberName)] public List Webhook2Headers { get; set; } = new(); } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs index 7c3601601f4f..d299f0eaf967 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] internal sealed class WebhookLogDto { public const string TableName = Constants.DatabaseSchema.Tables.WebhookLog; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = true)] public int Id { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookRequestDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookRequestDto.cs index 240fab3c1124..9e524ba63fcd 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookRequestDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookRequestDto.cs @@ -5,13 +5,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Dtos; [TableName(TableName)] -[PrimaryKey("id", AutoIncrement = true)] +[PrimaryKey(PrimaryKeyColumnName, AutoIncrement = true)] [ExplicitColumns] public class WebhookRequestDto { public const string TableName = Constants.DatabaseSchema.Tables.WebhookRequest; + public const string PrimaryKeyColumnName = Constants.DatabaseSchema.Columns.PrimaryKeyNameId; - [Column("id")] + [Column(PrimaryKeyColumnName)] [PrimaryKeyColumn(AutoIncrement = true)] public int Id { get; set; }