Breaking changes

    In this article you will find a list of breaking changes made between Umbraco 9 and 10.

    The article is subject to change, the closer we get to the launch of Umbraco 10.

    Update 'diff' from 3.5.0 to 5.0.0

    The difflibrary used in the Backoffice client has been updated and introduces a breaking change since the exposed global object has been renamed from JsDiff to Diff.

    Content Schedule performance

    Removes mutable ContentSchedule property from IContent/Content to read/write content schedules.

    Use IContentService.GetContentScheduleByContentId && IContentService.PersistContentSchedule or the optional contentSchedule parameter on IContentService.Save instead.

    Removed redundant event handling code

    • Removed public methods: PublishedSnapshotServiceEventHandler.Dispose, PublishedSnapshotServiceEventHandler.Dispose(bool), and .PublishedSnapshotServiceEventHandler.Initialize.
    • Removed public ctor.

    Scope provider cleanup

    • Some public classes in the Cms.Core.Services namespace has moved assembly from Umbraco.Cms.Infrastructure to Umbraco.Cms.Core.

    • These same public classes have changed namespace from Umbraco.Cms.Core.Services.Implement to Umbraco.Cms.Core.Services.

    Update to NPoco5

    NPoco types and interfaces are part of our public interface which means that this upgrade imposes breaking changes.

    SQLite support

    • Removed support for Microsoft SQL Server Compact (SQL CE).

    • Removed ReadLock and WriteLock methods from ISqlSyntaxProvider interface. Use IDistributedLockingMechanism (or IScope which delegates to IDistributedLockingMechanism) instead.

    • Constants for SQL Server provider name moved+consolidated from Core.Constants.DatabaseProviders and Core.Constants.-DbProviderNames to Umbraco.Cms.Persistence.SqlServer.Constants

    • Various SQL Server related services moved from the Umbraco.Infrastructure project to the new Umbraco.Cms.Persistence.

    • SqlServer project with altered namespaces e.g. SqlServerSyntaxProvider, SqlServerBulkSqlInsertProvider, SqlServerDatabaseCreator.

    Added the following methods/properties to ISqlSyntaxProvider. These must be implemented in any downstream implementation e.g:

    • ISqlSyntaxProvider.HandleCreateTable(IDatabase,TableDefinition,Boolean)
    • ISqlSyntaxProvider.GetFieldNameForUpdate()
    • ISqlSyntaxProvider.GetColumn(DatabaseType,String,String,String,String,Boolean)
    • ISqlSyntaxProvider.InsertForUpdateHint(Sql)
    • ISqlSyntaxProvider.AppendForUpdateHint(Sql)
    • ISqlSyntaxProvider.LeftJoinWithNestedJoin(Sql,Func<Sql,Sql>,String)

    Update to ImageSharp v2

    Update dependency versions:

    • SixLabors.ImageSharp from 1.0.4 to 2.1.1

    • SixLabors.ImageSharp.Web from 1.0.5 to 2.0.0

    Renamed CachedNameLength property to CacheHashLength on ImagingCacheSettings.

    Moved ImageSharpImageUrlGenerator from project Umbraco.Infrastructure to Umbraco.Web.Common and updated the corresponding namespace and DI registration (from AddCoreInitialServices() to AddUmbracoImageSharp());

    Moved ImageSharp configuration from the AddUmbracoImageSharp() extension method into separate IConfigureOptions<> implementations:

    • The middleware is configured in ConfigureImageSharpMiddlewareOptions (which also replaces ImageSharpConfigurationOptions that previously only set the default ImageSharp configuration);

    • The default physical cache is configured in ConfigurePhysicalFileSystemCacheOptions.

    Migrate Member properties to columns on the Member table

    This is breaking because it is no longer possible to access the properties listed below through the IMember.Properties collection. You must now access them through their specific properties i.e. IMember.IsLockedOut.

    • umbracoMemberFailedPasswordAttempts
    • umbracoMemberApproved
    • umbracoMemberLockedOut
    • umbracoMemberLastLockoutDate
    • umbracoMemberLastLogin
    • umbracoMemberLastPasswordChangeDate

    Additionally, when previously you resolved a Member as published content, all the default properties would be there twice. For instance, IsLockedOut would be there both as a property with the alias umbracoMemberLockedOut and with the alias IsLockedOut. Now it'll only be there once, with the alias being the name of the property, so IsLockedOut in this instance.

    Lastly the nullable dates on a user, i.e. LastLoginLate will now be null instead of DateTime.MinValue when getting a user with the UserService.

    Update examine to version 3

    Examine 3 breaking changes:

    • ValueSet immutable.
    • ValueSetValidationResult is renamed to ValueSetValidationStatus and ValueSetValidationResult is now a type.

    Async support for content finders

    bool TryFindContent(IPublishedRequestBuilder request);

    Has changed to:

    Task<bool> TryFindContent(IPublishedRequestBuilder request);

    Improve redirect Content finder scalability

    • Added more methods to IRedirectUrlRepository and IRedirectUrlService.cs.

    Fix Block List settings exception and optimize PVCs

    • Added a new method on IPublishedModelFactory: Type GetModelType(string? alias);
    • The generic types of a BlockListItem<TContent, TSettings>instance in theBlockListModelreturned byBlockListPropertyValueConverteris now determined by calling this new method, which can be different and cause aModelBindingException` in your views.
    IEnumerable<SearchResultEntity?> Search(string query, int pageSize, long pageIndex, out long totalFound, string? searchFrom 
    = null)

    Has changed to:

    Task<EntitySearchResults> SearchAsync(string query, int pageSize, long pageIndex, string? searchFrom = null);

    Moved StackQueue to correct namespace

    StackQueue has been moved from Umbraco.Core.Collections to the Umbraco.Cms.Core.Collections namespace.

    Globalsetting SqlWriteLockTimeOut has been removed

    This setting has been superseeded by DistributedLockingWriteLockDefaultTimeout.