{"record":{"id":"5c590cf77005b68d","repo":"OrchardCMS/OrchardCore","slug":"content-part-name-is-reserved-for-internal-use","errorCode":null,"errorMessage":"Content part name is reserved for internal use","messagePattern":"Content part name is reserved for internal use","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.ContentManagement.Abstractions/Metadata/Builders/ContentPartDefinitionBuilder.cs","lineNumber":52,"sourceCode":"            _settings = existing.Settings.Clone();\n        }\n    }\n\n    public string Name { get; private set; }\n\n    public ContentPartDefinition Build()\n    {\n        if (!char.IsLetter(Name[0]))\n        {\n            throw new ArgumentException(\"Content part name must start with a letter\", \"name\");\n        }\n        if (!string.Equals(Name, Name.ToSafeName(), StringComparison.OrdinalIgnoreCase))\n        {\n            throw new ArgumentException(\"Content part name contains invalid characters\", \"name\");\n        }\n        if (Name.IsReservedContentName())\n        {\n            throw new ArgumentException(\"Content part name is reserved for internal use\", \"name\");\n        }\n\n        return new ContentPartDefinition(Name, _fields, _settings);\n    }\n\n    public ContentPartDefinitionBuilder Named(string name)\n    {\n        Name = name;\n\n        return this;\n    }\n\n    public ContentPartDefinitionBuilder RemoveField(string fieldName)\n    {\n        var existingField = _fields.SingleOrDefault(x => string.Equals(x.Name, fieldName, StringComparison.OrdinalIgnoreCase));\n        if (existingField != null)\n        {\n            _fields.Remove(existingField);","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.ContentManagement.Abstractions/Metadata/Builders/ContentPartDefinitionBuilder.cs#L34-L70","documentation":"ContentPartDefinitionBuilder.Build throws ArgumentException when the part name matches a reserved internal content name (checked via IsReservedContentName). Certain names like 'ContentItem', 'ContentPart', 'ContentField' are reserved for framework use.","triggerScenarios":"builder.Named(\"ContentItem\") (or other reserved names) followed by Build(); recipes or migrations defining a part with a name colliding with internal framework names.","commonSituations":"Importing definitions from another system where the name seemed fine, intentionally trying to redefine framework reserved names, generic naming like 'Content'.","solutions":["Choose a different, non-reserved name, ideally prefixed with your module/domain, e.g. \"MyModule.Content\".","Check the name against IsReservedContentName() before calling Build().","If migrating content, rename the part definition and update all type definitions referencing it."],"exampleFix":"// before\nbuilder.Named(\"ContentItem\").Build(); // throws\n\n// after\nbuilder.Named(\"MyModuleContentItem\").Build();","handlingStrategy":"validation","validationCode":"bool isReserved = rawName.IsReservedContentName();\nif (isReserved) throw new InvalidOperationException(\"Name is reserved\");","typeGuard":null,"tryCatchPattern":"try\n{\n    var def = builder.Build();\n}\ncatch (ArgumentException e) when (e.Message.Contains(\"reserved\"))\n{\n    // suggest alternative name to the user\n}","preventionTips":["Check IsReservedContentName() when accepting part names from users or imports.","Namespace custom names with a module prefix to avoid collisions.","Keep a deny-list of framework names in any custom naming UI."],"tags":["naming","content-part","reserved-names"],"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"}