HomeDev GuideRecipesAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunityOptimizely AcademySubmit a ticketLog In
Dev Guide

Content types and property definitions breaking changes

Breaking changes to content types, property definitions, tab definitions, block types, and Dynamic Properties in CMS 13.

This article covers content type, property definition, tab definition, block type, and Dynamic Properties breaking changes in CMS 13.

Name validation rules

CMS 13 enforces stricter naming rules across content types, property definitions, property definition types, and tab definitions. These rules are applied during database migration and at runtime.

Rules for all definition names

  • Length: Names must be between 2 and 255 characters.
  • Format: Names must follow the regex pattern ^[A-Za-z][_0-9A-Za-z]+ — they must start with a letter and contain only letters, digits, and underscores.
  • Spaces and special characters are not allowed in programmatic names. Use [Display(Name = "...")] attributes to set human-readable display names.

Automatic migration

Existing definitions with invalid names are migrated automatically when upgrading to CMS 13:

Definition TypeSingle-character prefixInvalid character replacement
Content types (ContentType.Name)CT_ prefix addedInvalid characters replaced with _
Property definitions (PropertyDefinition.Name)PD_ prefix addedInvalid characters replaced with _
Property definition types (PropertyDefinitionType.Name)PDT_ prefix addedInvalid characters replaced with _
Tab definitions (TabDefinition.Name)G_ prefix addedInvalid characters replaced with _

Tab definition impact

Tab names that previously contained spaces or special characters (for example, "List Definition", "Meta Data / SEO", "Error Pages") must be updated to valid names (for example, "ListDefinition", "MetaData", "ErrorPages"). Use the [Display(Name = "...")] attribute to preserve the human-readable display name in the UI.

EPiServer.DataAbstraction.ContentType

  • Property DefaultWebFormTemplate was removed because WebForms is not supported.

  • LocalizationService service properties were removed as localized labels are retrieved directly from the LocalizationService.

EPiServer.DataAbstraction.IContentTypeRepository

The IContentTypeRepository interface has significant behavior changes in CMS 13:

  • The generic IContentTypeRepository<> implementation was removed. Use the non-generic IContentTypeRepository instead.
  • The interface now implements methods previously inherited from EPiServer.DataAbstraction.IContentTypeRepository<>.
  • The interface includes the Save(IEnumerable<ContentType>, ContentTypeSaveOptions) method previously specified on EPiServer.DataAbstraction.ContentTypeRepository.
  • The Save(ContentType) method also saves the PropertyDefinitions on the ContentType.
  • Load(string name) is now case-insensitive.
  • Default behavior for method Save has changed so properties not present in contentType.PropertyDefinitions are deleted. Previously, they were deleted only if no data was persisted. Use ContentTypeSaveOptions.KeepUndefinedPropertyDefinitions to keep properties not present in the definition.
  • Changes only in casing on properties (Name, EditCaption, HelpText, DefaultValue, and EditorHint) are no longer ignored when saving.
  • Changing Required for a property definition is now considered a Major semantic change (previously it was Minor).
  • Saving a content type with an empty ACL no longer resets it to its default value. Saving with ACL set to null still resets to the default.
  • Saving a content type with an ACL containing an entry with a different access level than Create now throws a ValidationException.
  • The Save method validates content type access requirements when creating a content item unless AccessLevel.NoAccess is passed in.
  • The List method now first sorts on SortOrder and then on Name for ContentTypes that have same value on SortOrder. Previously the sorting was not deterministic for ContentTypes with same SortOrder.

EPiServer.DataAbstraction.ContentTypeRepository

This base class is obsolete and is no longer implemented by the default implementation.

EPiServer.DataAbstraction.ContentTypeModelRepository

The class is obsolete, to be replaced by the EPiServer.DataAbstraction.RuntimeModel.IContentTypeModelRepository service. The default constructor was replaced by one taking dependencies.

EPiServer.DataAbstraction.IPropertyDefinitionRepository

  • Methods Save and Delete were made obsolete with a compilation error. To add, update, or remove a PropertyDefinition from a ContentType, load the ContentType and add, update, or remove entries in the property PropertyDefinitions.
  • CheckUsage()isDynamic parameter was removed. Dynamic Properties are no longer supported.
  • GetUsage()isDynamic parameter was removed. Dynamic Properties are no longer supported.
  • ListDynamic() – Method was removed. Dynamic Properties are no longer supported.
  • Save – A new argument was added to indicate whether the cache should be cleared.
    • Throws ValidationException instead of DataAbstractionException when the PropertyDefinition.Name is invalid.
    • Throws ValidationException instead of NotSupportedException when a block property is set as Required or LanguageSpecific.
    • Throws ValidationException instead of DataAbstractionException when a block used in a list property contains a category property.

EPiServer.DataAbstraction.PropertyDefinitionRepository

  • The PropertyDefinitionRepository is obsolete and is no longer used in the CMS. Use IPropertyDefinitionRepository instead.
  • The PropertyDefinitionSaved event no longer raises when a Tab or PropertyDefinitionType is updated.

EPiServer.DataAbstraction.PropertyDefinition

  • Property Searchable is obsolete in favor of property IndexingType.
  • Property IsDynamicProperty was removed. Dynamic Properties are no longer supported.
  • Property LocalizationService was obsoleted.

EPiServer.DataAbstraction.PropertyDefinitionFields

  • Searchable was removed in favor of IndexingType.

EPiServer.DataAbstraction.PropertyDefinitionType

  • LocalizationService and ContentTypeRepository service properties were removed as localized labels are retrieved directly from the LocalizationService.

EPiServer.DataAbstraction.IPropertyDefinitionTypeRepository

  • Method Save throws ValidationException instead of ArgumentException when the PropertyDefinitionType.Name is invalid.
  • Events PropertyDefinitionTypeDeleted, PropertyDefinitionTypeSaving, and PropertyDefinitionTypeSaved on Internal.PropertyDefinitionTypeRepository were removed in favor of events on the IPropertyDefinitionTypeEvents interface.

EPiServer.DataAbstraction.IBackingTypeResolver

  • The return type of the Resolve method changed from Type to PropertyDefinitionTypeResolution. The .NET backing type can be accessed from the PropertyDefinitionType.DefinitionType instead.

Block type changes

  • EPiServer.DataAbstraction.BlockPropertyDefinitionType – CMS 13 no longer creates different PropertyDefinitionType instances per block type. Instead, there is a common PropertyDefinitionType (with DataType as Block) for all block types. The specific block type is defined on PropertyDefinition.ItemTypeReference for a block property.

  • EPiServer.DataAbstraction.BlockTypeRepository – Removed in favor of EPiServer.DataAbstraction.IContentTypeRepository.

  • EPiServer.DataAbstraction.PageTypeRepository – Removed in favor of EPiServer.DataAbstraction.IContentTypeRepository.

  • EPiServer.DataAbstraction.PageType – Properties FileName, FileNameForSite, and ExportableFileName were removed (historical WebForms support). fileName was removed from the constructor.

Searchable attribute changes

  • EPiServer.DataAnnotations.SearchableAttribute – Type now inherits EPiServer.DataAnnotations.IndexingTypeAttribute. The constructor that accepted a bool argument is obsolete. Use IndexingTypeAttribute instead. The property IsSearchable is made obsolete in favor of IndexingType.

  • EPiServer.DataAbstraction.RuntimeModel.PropertyDefinitionModelSearchable was removed in favor of IndexingType.

EPiServer.DataAbstraction.TabDefinition

  • Constructor with LocalizationService argument was removed. Use other constructor.

EPiServer.DataAbstraction.ITabDefinitionRepository

  • Method Save throws ValidationException instead of DataAbstractionException when the TabDefinition.Name is empty.

Runtime model changes

  • EPiServer.DataAbstraction.RuntimeModel.ContentDataInterceptor – Made internal.

  • EPiServer.DataAbstraction.RuntimeModel.ContentDataInterceptorHandler – Made internal. If you need to register a custom accessor for property data, use EPiServer.DataAbstraction.RuntimeModel.IPropertyDataInterceptorRegistrator instead.

  • EPiServer.DataAbstraction.RuntimeModel.IAvailableModelSettingsRepository – New method GetRuntimeSetting(ContentType contentType) was added.

  • EPiServer.DataAbstraction.RuntimeModel.IContentTypeModelRepository – New method GetContentTypeModel(ContentType contentType) was added.

Dynamic Properties removal

Dynamic Properties are fully removed in CMS 13. The following classes, interfaces, and members have been deleted:

  • EPiServer.DataAbstraction.DynamicProperty
  • EPiServer.DataAbstraction.DynamicPropertyCollection
  • EPiServer.DataAbstraction.DynamicPropertyStatus
  • EPiServer.Core.DynamicPropertyBag
  • EPiServer.Core.DynamicPropertyCache
  • EPiServer.Core.DynamicPropertyLookup
  • EPiServer.Core.DynamicPropertyPage
  • EPiServer.Core.IDynamicPropertyLookup
  • EPiServer.Core.ContentOptions.EnableDynamicProperties – Now throws NotSupportedException.
  • EPiServer.DataAbstraction.PropertyDefinition.IsDynamicProperty – Removed.
  • EPiServer.DataAbstraction.PropertyGetHandler.PropertyHandlerWithDynamicProperties() – Removed.

The associated stored procedures and database tables have also been removed.

Other data abstraction changes

  • EPiServer.DataAbstraction.Activities.Activity – Property RawData was removed in favor of property ExtendedData.

  • EPiServer.DataAbstraction.Activities.ContentActivityFeed – The Instance property is obsolete. Retrieve the singleton instance from the service container.

  • EPiServer.DataAbstraction.ContentCoreData – Removed in favor of EPiServer.DataAbstraction.ContentNode. The ContentNode class provides similar functionality with improved naming and additional tracking properties.

  • EPiServer.DataAbstraction.IContentCoreDataLoader – Removed in favor of EPiServer.DataAbstraction.IContentNodeLoader.

  • EPiServer.DataAbstraction.ConflictingResourceException – Constructor that accepts message and inner exception has replaced another constructor.

  • EPiServer.DataAbstraction.ILanguageBranchRepository – Method Save now throws ConflictingResourceException instead of DataAbstractionException when the LanguageBranch.LanguageID already exists, and instead of EPiServerException when the LanguageBranch.URLSegment is already in use.

  • EPiServer.DataAbstraction.CategoryLocalizationService service properties were removed.

  • EPiServer.DataAbstraction.FrameLocalizationService service properties were removed.

  • EPiServer.DataAbstraction.SoftLink – Property LinkStatus was removed. Use property HttpStatusCode instead.

  • EPiServer.DataAbstraction.IContentSoftLinkRepository – New method Load was added.

  • EPiServer.DataAbstraction.ContentCoreData – Property ExternalFolderID was removed because it is no longer used.