{"record":{"id":"b43d43324d30a05d","repo":"OrchardCMS/OrchardCore","slug":"content-type-name-is-reserved-for-internal-use","errorCode":null,"errorMessage":"Content type name is reserved for internal use","messagePattern":"Content type name is reserved for internal use","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.ContentManagement.Abstractions/Metadata/Builders/ContentTypeDefinitionBuilder.cs","lineNumber":51,"sourceCode":"            _displayName = existing.DisplayName;\n            _parts = existing.Parts.ToList();\n            _settings = existing.Settings.Clone();\n        }\n    }\n\n    public ContentTypeDefinition Build()\n    {\n        if (!char.IsLetter(_name[0]))\n        {\n            throw new ArgumentException(\"Content type name must start with a letter\", \"name\");\n        }\n        if (!string.Equals(_name, _name.ToSafeName(), StringComparison.OrdinalIgnoreCase))\n        {\n            throw new ArgumentException(\"Content type name contains invalid characters\", \"name\");\n        }\n        if (_name.IsReservedContentName())\n        {\n            throw new ArgumentException(\"Content type name is reserved for internal use\", \"name\");\n        }\n\n        return new ContentTypeDefinition(_name, _displayName, _parts, _settings);\n    }\n\n    [Obsolete(\"This method has been deprecated, please use WithName() instead.\")]\n    public ContentTypeDefinitionBuilder Named(string name) => WithName(name);\n\n    public ContentTypeDefinitionBuilder WithName(string name)\n    {\n        _name = name;\n\n        return this;\n    }\n\n    [Obsolete(\"This method has been deprecated, please use WithDisplayName() instead.\")]\n    public ContentTypeDefinitionBuilder DisplayedAs(string displayName) => WithDisplayName(displayName);\n","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.ContentManagement.Abstractions/Metadata/Builders/ContentTypeDefinitionBuilder.cs#L33-L69","documentation":"ContentTypeDefinitionBuilder.Build() rejects content type names considered reserved for internal use via IsReservedContentName(). Orchard reserves names starting with prefixes like 'List', 'Container', or otherwise colliding with internal systems, to prevent ambiguity with framework-generated content types.","triggerScenarios":"Calling AlterTypeDefinitionAsync with a name matching a reserved pattern (e.g. names starting with 'List' or other reserved prefixes defined in StringExtensions.IsReservedContentName)","commonSituations":"Creating types like 'ListItem' or 'List' for custom listing features; renaming existing internal types; migrating legacy systems where 'List' was not reserved","solutions":["Rename the content type to a non-reserved name (prefix with your module/brand, e.g. 'MyModuleListItem')","Reuse the built-in List/Container types instead of defining a colliding name","Update all references: migrations, recipes, placement.json, and queries that reference the old name"],"exampleFix":"// before\nbuilder.AlterTypeDefinitionAsync(\"ListItem\", t => t.WithDisplayName(\"List Item\"));\n// after\nbuilder.AlterTypeDefinitionAsync(\"MyStoreListItem\", t => t.WithDisplayName(\"List Item\"));","handlingStrategy":"validation","validationCode":"if (typeName.IsReservedContentName())\n    throw new ArgumentException($\"'{typeName}' is reserved for internal use; choose another name.\");","typeGuard":null,"tryCatchPattern":"try\n{\n    await builder.AlterTypeDefinitionAsync(name, configure);\n}\ncatch (ArgumentException ex) when (ex.Message.Contains(\"reserved\"))\n{\n    _logger.LogError(ex, \"Content type name '{Name}' is reserved\", name);\n}","preventionTips":["Prefix custom type names with your module or brand to avoid reserved names like 'List*'","Check IsReservedContentName() in migrations before altering definitions","Reuse built-in List/Container types rather than shadowing them"],"tags":["content-management","validation","naming","migrations"],"backgroundTag":"invalid-identifier-format","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}