From 63b77b77436aff518685a520841422309d781810 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Fri, 6 May 2022 10:13:58 +0200 Subject: [PATCH] Further NRT amends (#12363) * Amended nullability of base Deploy classes. * Ensured ContentItemDisplay.Variants is non-nullable. * Set IArtifactSignature.Dependencies to be non-nullable. * Update template collection retrieval to be non-nullable. * IMediaService.GetRootMedia to be non-nullable. * Non-nullable collection for IMemberService.GetMembersByMemberType. * Non-nullable collection for member role retrieval. * Non-nullable collection for root dictionary items. * Non-nullable collection for child dictionary items. * Applied suggestions from code review Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> * Remove extra dot Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Co-authored-by: Nikolaj Geisle --- src/Umbraco.Core/Deploy/ArtifactBase.cs | 14 ++++------ .../Deploy/ArtifactDeployState.cs | 2 +- .../ArtifactDeployStateOfTArtifactTEntity.cs | 4 +-- src/Umbraco.Core/Deploy/IArtifactSignature.cs | 4 +-- .../ContentEditing/ContentItemDisplay.cs | 2 +- .../Models/Mapping/ContentVariantMapper.cs | 16 +++++------- .../Mapping/MemberTabsAndPropertiesMapper.cs | 4 +-- .../Models/Membership/MemberExportModel.cs | 7 ++--- .../Repositories/ITemplateRepository.cs | 4 +-- src/Umbraco.Core/Services/FileService.cs | 8 +++--- src/Umbraco.Core/Services/IFileService.cs | 4 +-- .../Services/ILocalizationService.cs | 6 ++--- src/Umbraco.Core/Services/IMediaService.cs | 2 +- src/Umbraco.Core/Services/IMemberService.cs | 6 ++--- .../Services/IMembershipRoleService.cs | 4 +-- .../Services/LocalizationService.cs | 26 +++++++------------ src/Umbraco.Core/Services/MediaService.cs | 2 +- src/Umbraco.Core/Services/MemberService.cs | 12 ++++----- .../Implement/TemplateRepository.cs | 14 +++++----- .../Mapping/ContentMapDefinition.cs | 6 +++-- 20 files changed, 67 insertions(+), 80 deletions(-) diff --git a/src/Umbraco.Core/Deploy/ArtifactBase.cs b/src/Umbraco.Core/Deploy/ArtifactBase.cs index ff5287d0b8..200b47096d 100644 --- a/src/Umbraco.Core/Deploy/ArtifactBase.cs +++ b/src/Umbraco.Core/Deploy/ArtifactBase.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; - namespace Umbraco.Cms.Core.Deploy { /// @@ -15,13 +11,13 @@ namespace Umbraco.Cms.Core.Deploy Udi = udi ?? throw new ArgumentNullException("udi"); Name = Udi.ToString(); - Dependencies = dependencies ?? Enumerable.Empty(); + _dependencies = dependencies ?? Enumerable.Empty(); _checksum = new Lazy(GetChecksum); } private readonly Lazy _checksum; - private IEnumerable? _dependencies; + private IEnumerable _dependencies; protected abstract string GetChecksum(); @@ -43,16 +39,16 @@ namespace Umbraco.Cms.Core.Deploy /// public bool ShouldSerializeChecksum() => false; - public IEnumerable? Dependencies + public IEnumerable Dependencies { get => _dependencies; - set => _dependencies = value?.OrderBy(x => x.Udi); + set => _dependencies = value.OrderBy(x => x.Udi); } #endregion public string Name { get; set; } - public string? Alias { get; set; } + public string Alias { get; set; } = string.Empty; } } diff --git a/src/Umbraco.Core/Deploy/ArtifactDeployState.cs b/src/Umbraco.Core/Deploy/ArtifactDeployState.cs index d451c1941d..0849f3526f 100644 --- a/src/Umbraco.Core/Deploy/ArtifactDeployState.cs +++ b/src/Umbraco.Core/Deploy/ArtifactDeployState.cs @@ -15,7 +15,7 @@ namespace Umbraco.Cms.Core.Deploy /// The service connector deploying the artifact. /// The next pass number. /// A deploying artifact. - public static ArtifactDeployState Create(TArtifact art, TEntity entity, IServiceConnector connector, int nextPass) + public static ArtifactDeployState Create(TArtifact art, TEntity? entity, IServiceConnector connector, int nextPass) where TArtifact : IArtifact { return new ArtifactDeployState(art, entity, connector, nextPass); diff --git a/src/Umbraco.Core/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs b/src/Umbraco.Core/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs index afe619f3bd..72724ee57b 100644 --- a/src/Umbraco.Core/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs +++ b/src/Umbraco.Core/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs @@ -15,7 +15,7 @@ namespace Umbraco.Cms.Core.Deploy /// The entity. /// The service connector deploying the artifact. /// The next pass number. - public ArtifactDeployState(TArtifact art, TEntity entity, IServiceConnector connector, int nextPass) + public ArtifactDeployState(TArtifact art, TEntity? entity, IServiceConnector connector, int nextPass) { Artifact = art; Entity = entity; @@ -31,7 +31,7 @@ namespace Umbraco.Cms.Core.Deploy /// /// Gets or sets the entity. /// - public TEntity Entity { get; set; } + public TEntity? Entity { get; set; } /// protected sealed override IArtifact GetArtifactAsIArtifact() diff --git a/src/Umbraco.Core/Deploy/IArtifactSignature.cs b/src/Umbraco.Core/Deploy/IArtifactSignature.cs index edd4d1ad42..695624cd86 100644 --- a/src/Umbraco.Core/Deploy/IArtifactSignature.cs +++ b/src/Umbraco.Core/Deploy/IArtifactSignature.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace Umbraco.Cms.Core.Deploy { @@ -36,6 +36,6 @@ namespace Umbraco.Cms.Core.Deploy /// /// Gets the dependencies of this artifact. /// - IEnumerable? Dependencies { get; } + IEnumerable Dependencies { get; } } } diff --git a/src/Umbraco.Core/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/ContentItemDisplay.cs index 85968222e7..874f2f085a 100644 --- a/src/Umbraco.Core/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Core/Models/ContentEditing/ContentItemDisplay.cs @@ -65,7 +65,7 @@ namespace Umbraco.Cms.Core.Models.ContentEditing /// If a content item is invariant, this collection will only contain one item, else it will contain all culture variants /// [DataMember(Name = "variants")] - public IEnumerable? Variants { get; set; } + public IEnumerable Variants { get; set; } [DataMember(Name = "owner")] public UserProfile? Owner { get; set; } diff --git a/src/Umbraco.Core/Models/Mapping/ContentVariantMapper.cs b/src/Umbraco.Core/Models/Mapping/ContentVariantMapper.cs index 4685fb9cc4..2f330b581f 100644 --- a/src/Umbraco.Core/Models/Mapping/ContentVariantMapper.cs +++ b/src/Umbraco.Core/Models/Mapping/ContentVariantMapper.cs @@ -19,12 +19,12 @@ namespace Umbraco.Cms.Core.Models.Mapping _localizedTextService = localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService)); } - public IEnumerable? Map(IContent source, MapperContext context) where TVariant : ContentVariantDisplay + public IEnumerable Map(IContent source, MapperContext context) where TVariant : ContentVariantDisplay { var variesByCulture = source.ContentType.VariesByCulture(); var variesBySegment = source.ContentType.VariesBySegment(); - IList? variants = new List(); + List variants = new (); if (!variesByCulture && !variesBySegment) { @@ -38,7 +38,7 @@ namespace Umbraco.Cms.Core.Models.Mapping else if (variesByCulture && !variesBySegment) { var languages = GetLanguages(context); - variants = languages? + variants = languages .Select(language => CreateVariantDisplay(context, source, language, null)) .WhereNotNull() .ToList(); @@ -47,7 +47,7 @@ namespace Umbraco.Cms.Core.Models.Mapping { // Segment only var segments = GetSegments(source); - variants = segments? + variants = segments .Select(segment => CreateVariantDisplay(context, source, null, segment)) .WhereNotNull() .ToList(); @@ -64,7 +64,7 @@ namespace Umbraco.Cms.Core.Models.Mapping throw new InvalidOperationException("No languages or segments available"); } - variants = languages? + variants = languages .SelectMany(language => segments .Select(segment => CreateVariantDisplay(context, source, language, segment))) .WhereNotNull() @@ -74,11 +74,9 @@ namespace Umbraco.Cms.Core.Models.Mapping return SortVariants(variants); } - - - private IList? SortVariants(IList? variants) where TVariant : ContentVariantDisplay + private IList SortVariants(IList variants) where TVariant : ContentVariantDisplay { - if (variants == null || variants.Count <= 1) + if (variants.Count <= 1) { return variants; } diff --git a/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs b/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs index d6d3453a26..9a39051590 100644 --- a/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs +++ b/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs @@ -155,9 +155,9 @@ namespace Umbraco.Cms.Core.Models.Mapping return prop; } - internal IDictionary GetMemberGroupValue(string? username) + internal IDictionary GetMemberGroupValue(string username) { - IEnumerable? userRoles = username.IsNullOrWhiteSpace() ? null : _memberService.GetAllRoles(username); + IEnumerable userRoles = _memberService.GetAllRoles(username); // create a dictionary of all roles (except internal roles) + "false" var result = _memberGroupService.GetAll() diff --git a/src/Umbraco.Core/Models/Membership/MemberExportModel.cs b/src/Umbraco.Core/Models/Membership/MemberExportModel.cs index e577c86e70..25ec9730d2 100644 --- a/src/Umbraco.Core/Models/Membership/MemberExportModel.cs +++ b/src/Umbraco.Core/Models/Membership/MemberExportModel.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; - namespace Umbraco.Cms.Core.Models.Membership { public class MemberExportModel @@ -10,10 +7,10 @@ namespace Umbraco.Cms.Core.Models.Membership public string? Name { get; set; } public string? Username { get; set; } public string? Email { get; set; } - public List? Groups { get; set; } + public List Groups { get; set; } = new (); public string? ContentTypeAlias { get; set; } public DateTime CreateDate { get; set; } public DateTime UpdateDate { get; set; } - public List? Properties { get; set; } + public List Properties { get; set; } = new (); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/ITemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ITemplateRepository.cs index fd206d5aff..185973623c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ITemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ITemplateRepository.cs @@ -7,9 +7,9 @@ namespace Umbraco.Cms.Core.Persistence.Repositories { ITemplate? Get(string? alias); - IEnumerable? GetAll(params string[] aliases); + IEnumerable GetAll(params string[] aliases); - IEnumerable? GetChildren(int masterTemplateId); + IEnumerable GetChildren(int masterTemplateId); IEnumerable GetDescendants(int masterTemplateId); } diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 2d901ffacd..d692765620 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -412,11 +412,11 @@ namespace Umbraco.Cms.Core.Services /// Gets a list of all objects /// /// An enumerable list of objects - public IEnumerable? GetTemplates(params string[] aliases) + public IEnumerable GetTemplates(params string[] aliases) { using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { - return _templateRepository.GetAll(aliases)?.OrderBy(x => x.Name); + return _templateRepository.GetAll(aliases).OrderBy(x => x.Name); } } @@ -424,11 +424,11 @@ namespace Umbraco.Cms.Core.Services /// Gets a list of all objects /// /// An enumerable list of objects - public IEnumerable? GetTemplates(int masterTemplateId) + public IEnumerable GetTemplates(int masterTemplateId) { using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { - return _templateRepository.GetChildren(masterTemplateId)?.OrderBy(x => x.Name); + return _templateRepository.GetChildren(masterTemplateId).OrderBy(x => x.Name); } } diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 8d68c20c81..6cbc06208c 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -199,13 +199,13 @@ namespace Umbraco.Cms.Core.Services /// Gets a list of all objects /// /// An enumerable list of objects - IEnumerable? GetTemplates(params string[] aliases); + IEnumerable GetTemplates(params string[] aliases); /// /// Gets a list of all objects /// /// An enumerable list of objects - IEnumerable? GetTemplates(int masterTemplateId); + IEnumerable GetTemplates(int masterTemplateId); /// /// Gets a object by its alias. diff --git a/src/Umbraco.Core/Services/ILocalizationService.cs b/src/Umbraco.Core/Services/ILocalizationService.cs index f68214cfc3..eca2a8e070 100644 --- a/src/Umbraco.Core/Services/ILocalizationService.cs +++ b/src/Umbraco.Core/Services/ILocalizationService.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Umbraco.Cms.Core.Models; @@ -59,7 +59,7 @@ namespace Umbraco.Cms.Core.Services /// /// Id of the parent /// An enumerable list of objects - IEnumerable? GetDictionaryItemChildren(Guid parentId); + IEnumerable GetDictionaryItemChildren(Guid parentId); /// /// Gets a list of descendants for a @@ -72,7 +72,7 @@ namespace Umbraco.Cms.Core.Services /// Gets the root/top objects /// /// An enumerable list of objects - IEnumerable? GetRootDictionaryItems(); + IEnumerable GetRootDictionaryItems(); /// /// Checks if a with given key exists diff --git a/src/Umbraco.Core/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs index ee6ba02b66..fe14bdda0f 100644 --- a/src/Umbraco.Core/Services/IMediaService.cs +++ b/src/Umbraco.Core/Services/IMediaService.cs @@ -130,7 +130,7 @@ namespace Umbraco.Cms.Core.Services /// Gets a collection of objects, which reside at the first level / root /// /// An Enumerable list of objects - IEnumerable? GetRootMedia(); + IEnumerable GetRootMedia(); /// /// Gets a collection of an objects, which resides in the Recycle Bin diff --git a/src/Umbraco.Core/Services/IMemberService.cs b/src/Umbraco.Core/Services/IMemberService.cs index 6701090915..d6e0480091 100644 --- a/src/Umbraco.Core/Services/IMemberService.cs +++ b/src/Umbraco.Core/Services/IMemberService.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Querying; @@ -127,14 +127,14 @@ namespace Umbraco.Cms.Core.Services /// /// Alias of the MemberType /// - IEnumerable? GetMembersByMemberType(string memberTypeAlias); + IEnumerable GetMembersByMemberType(string memberTypeAlias); /// /// Gets all Members for the MemberType id /// /// Id of the MemberType /// - IEnumerable? GetMembersByMemberType(int memberTypeId); + IEnumerable GetMembersByMemberType(int memberTypeId); /// /// Gets all Members within the specified MemberGroup name diff --git a/src/Umbraco.Core/Services/IMembershipRoleService.cs b/src/Umbraco.Core/Services/IMembershipRoleService.cs index 70e1d53491..5c62a84973 100644 --- a/src/Umbraco.Core/Services/IMembershipRoleService.cs +++ b/src/Umbraco.Core/Services/IMembershipRoleService.cs @@ -12,9 +12,9 @@ namespace Umbraco.Cms.Core.Services IEnumerable GetAllRoles(); - IEnumerable? GetAllRoles(int memberId); + IEnumerable GetAllRoles(int memberId); - IEnumerable GetAllRoles(string? username); + IEnumerable GetAllRoles(string username); IEnumerable GetAllRolesIds(); diff --git a/src/Umbraco.Core/Services/LocalizationService.cs b/src/Umbraco.Core/Services/LocalizationService.cs index ac9d800cb1..262697c935 100644 --- a/src/Umbraco.Core/Services/LocalizationService.cs +++ b/src/Umbraco.Core/Services/LocalizationService.cs @@ -179,18 +179,15 @@ namespace Umbraco.Cms.Core.Services /// /// Id of the parent /// An enumerable list of objects - public IEnumerable? GetDictionaryItemChildren(Guid parentId) + public IEnumerable GetDictionaryItemChildren(Guid parentId) { using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { var query = Query().Where(x => x.ParentId == parentId); - var items = _dictionaryRepository.Get(query)?.ToArray(); - if (items is not null) - { - //ensure the lazy Language callback is assigned - foreach (var item in items) - EnsureDictionaryItemLanguageCallback(item); - } + var items = _dictionaryRepository.Get(query).ToArray(); + //ensure the lazy Language callback is assigned + foreach (var item in items) + EnsureDictionaryItemLanguageCallback(item); return items; } @@ -217,18 +214,15 @@ namespace Umbraco.Cms.Core.Services /// Gets the root/top objects /// /// An enumerable list of objects - public IEnumerable? GetRootDictionaryItems() + public IEnumerable GetRootDictionaryItems() { using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { var query = Query().Where(x => x.ParentId == null); - var items = _dictionaryRepository.Get(query)?.ToArray(); - if (items is not null) - { - //ensure the lazy Language callback is assigned - foreach (var item in items) - EnsureDictionaryItemLanguageCallback(item); - } + var items = _dictionaryRepository.Get(query).ToArray(); + //ensure the lazy Language callback is assigned + foreach (var item in items) + EnsureDictionaryItemLanguageCallback(item); return items; } } diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 446dae4f39..13ba415fee 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -590,7 +590,7 @@ namespace Umbraco.Cms.Core.Services /// Gets a collection of objects, which reside at the first level / root /// /// An Enumerable list of objects - public IEnumerable? GetRootMedia() + public IEnumerable GetRootMedia() { using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index 9d1b9edf9d..2a4498f7e4 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -406,7 +406,7 @@ namespace Umbraco.Cms.Core.Services /// /// Alias of the MemberType /// - public IEnumerable? GetMembersByMemberType(string memberTypeAlias) + public IEnumerable GetMembersByMemberType(string memberTypeAlias) { using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { @@ -421,7 +421,7 @@ namespace Umbraco.Cms.Core.Services /// /// Id of the MemberType /// - public IEnumerable? GetMembersByMemberType(int memberTypeId) + public IEnumerable GetMembersByMemberType(int memberTypeId) { using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { @@ -894,17 +894,17 @@ namespace Umbraco.Cms.Core.Services /// /// /// A list of member roles - public IEnumerable? GetAllRoles(int memberId) + public IEnumerable GetAllRoles(int memberId) { using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { scope.ReadLock(Constants.Locks.MemberTree); var result = _memberGroupRepository.GetMemberGroupsForMember(memberId); - return result.Select(x => x.Name).Distinct(); + return result.Select(x => x.Name).WhereNotNull().Distinct(); } } - public IEnumerable GetAllRoles(string? username) + public IEnumerable GetAllRoles(string username) { using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { @@ -1107,7 +1107,7 @@ namespace Umbraco.Cms.Core.Services Name = member.Name, Username = member.Username, Email = member.Email, - Groups = GetAllRoles(member.Id)?.ToList(), + Groups = GetAllRoles(member.Id).ToList(), ContentTypeAlias = member.ContentTypeAlias, CreateDate = member.CreateDate, UpdateDate = member.UpdateDate, diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs index e214e2ef20..4dc3bb71f2 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs @@ -504,7 +504,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement public ITemplate? Get(string? alias) => GetAll(alias)?.FirstOrDefault(); - public IEnumerable? GetAll(params string?[] aliases) + public IEnumerable GetAll(params string?[] aliases) { //We must call the base (normal) GetAll method // which is cached. This is a specialized method and unfortunately with the params[] it @@ -515,26 +515,26 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement } //return from base.GetAll, this is all cached - return base.GetMany()?.Where(x => aliases.WhereNotNull().InvariantContains(x.Alias)); + return base.GetMany().Where(x => aliases.WhereNotNull().InvariantContains(x.Alias)); } - public IEnumerable? GetChildren(int masterTemplateId) + public IEnumerable GetChildren(int masterTemplateId) { //return from base.GetAll, this is all cached - ITemplate[]? all = base.GetMany()?.ToArray(); + ITemplate[] all = base.GetMany().ToArray(); if (masterTemplateId <= 0) { - return all?.Where(x => x.MasterTemplateAlias.IsNullOrWhiteSpace()); + return all.Where(x => x.MasterTemplateAlias.IsNullOrWhiteSpace()); } - ITemplate? parent = all?.FirstOrDefault(x => x.Id == masterTemplateId); + ITemplate? parent = all.FirstOrDefault(x => x.Id == masterTemplateId); if (parent == null) { return Enumerable.Empty(); } - IEnumerable? children = all?.Where(x => x.MasterTemplateAlias.InvariantEquals(parent.Alias)); + IEnumerable children = all.Where(x => x.MasterTemplateAlias.InvariantEquals(parent.Alias)); return children; } diff --git a/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs b/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs index 91fda179e2..24cd1c5cbe 100644 --- a/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs +++ b/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs @@ -160,8 +160,10 @@ namespace Umbraco.Cms.Web.BackOffice.Mapping target.Urls = GetUrls(source); target.Variants = _contentVariantMapper.Map(source, context); - target.ContentDto = new ContentPropertyCollectionDto(); - target.ContentDto.Properties = context.MapEnumerable(source.Properties).WhereNotNull(); + target.ContentDto = new ContentPropertyCollectionDto + { + Properties = context.MapEnumerable(source.Properties).WhereNotNull() + }; } // Umbraco.Code.MapAll -Segment -Language -DisplayName