Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
3ec8867
Squash merge Squash merged v173/20453-fix-more-sql-syntax-issues int …
idseefeld Jan 7, 2026
2a27b4e
replace some column names with constants for use in raw sql statements
idseefeld Jan 7, 2026
41ef0df
fix 2 unit test
idseefeld Jan 7, 2026
d5f4f88
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 8, 2026
803041f
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 8, 2026
214978d
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 8, 2026
ee84947
fix Copilot review comments
idseefeld Jan 8, 2026
2398483
resolve review comments
idseefeld Jan 9, 2026
1390acf
replace more hard coded strings
idseefeld Jan 9, 2026
9bc68dd
fix test
idseefeld Jan 9, 2026
9cd2b09
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 9, 2026
d2547ef
fix review comments
idseefeld Jan 9, 2026
bb0dcd4
fix database schema
idseefeld Jan 10, 2026
44e3d8d
fix database schema and ResultColumn reference names
idseefeld Jan 10, 2026
8118a3f
Update src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeAllowed…
idseefeld Jan 10, 2026
7e64ceb
add comment from review
idseefeld Jan 10, 2026
fd6465d
fix two reference column names
idseefeld Jan 10, 2026
0e4a963
fix breaking change
idseefeld Jan 10, 2026
327f8dc
fix typo
idseefeld Jan 10, 2026
34118b6
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 12, 2026
afeab7f
Remove unnecessary attributes
idseefeld Jan 12, 2026
22f1c01
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 13, 2026
143adb9
mark 2 unsused DTO classes as obsolete
idseefeld Jan 13, 2026
e88b7fb
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 13, 2026
58b38a0
reverted change of class UnionHelperDto adding [Column("...")] attrib…
idseefeld Jan 13, 2026
f6bbd7a
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 13, 2026
d6ef92d
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 14, 2026
5d47a41
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 15, 2026
8f6e406
replace nameof reference names,
idseefeld Jan 15, 2026
81384f7
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 15, 2026
15c612f
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 15, 2026
ce48f07
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 15, 2026
63debf9
Merge branch 'main' into v173/20453-dto-constants
idseefeld Jan 15, 2026
b3dffd1
Update obsoletion messages
AndyButland Jan 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down
7 changes: 4 additions & 3 deletions src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand All @@ -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<AccessRuleDto> Rules { get; set; } = new();
}
19 changes: 13 additions & 6 deletions src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down
5 changes: 3 additions & 2 deletions src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
5 changes: 3 additions & 2 deletions src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand Down
16 changes: 10 additions & 6 deletions src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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!;
}
21 changes: 13 additions & 8 deletions src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

/// <summary>
Expand All @@ -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; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand Down
13 changes: 9 additions & 4 deletions src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down Expand Up @@ -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!;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down
Loading
Loading