{"record":{"id":"0336ec751b66be3b","repo":"OrchardCMS/OrchardCore","slug":"unable-to-remove-system-defined-field","errorCode":null,"errorMessage":"Unable to remove system-defined field.","messagePattern":"Unable to remove system-defined field\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore.Modules/OrchardCore.ContentTypes/Services/ContentDefinitionService.cs","lineNumber":319,"sourceCode":"            ContentFieldName = fieldName,\n            ContentFieldDisplayName = displayName,\n        }, _logger);\n    }\n\n    public async Task RemoveFieldFromPartAsync(string fieldName, string partName)\n    {\n        var partDefinition = await _contentDefinitionManager.LoadPartDefinitionAsync(partName);\n\n        if (partDefinition == null)\n        {\n            return;\n        }\n\n        var settings = partDefinition.GetSettings<ContentSettings>();\n\n        if (settings.IsSystemDefined)\n        {\n            throw new InvalidOperationException(\"Unable to remove system-defined field.\");\n        }\n\n        await _contentDefinitionManager.AlterPartDefinitionAsync(partName, typeBuilder => typeBuilder.RemoveField(fieldName));\n\n        var context = new ContentFieldDetachedContext\n        {\n            ContentPartName = partName,\n            ContentFieldName = fieldName,\n        };\n\n        _contentDefinitionEventHandlers.Invoke((handler, ctx) => handler.ContentFieldDetached(ctx), context, _logger);\n    }\n\n    public async Task AlterFieldAsync(AlterFieldContext context)\n    {\n        await _contentDefinitionManager.AlterPartDefinitionAsync(context.PartName, partBuilder =>\n        {\n            partBuilder.WithField(context.FieldName, fieldBuilder =>","sourceCodeStart":301,"sourceCodeEnd":337,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore.Modules/OrchardCore.ContentTypes/Services/ContentDefinitionService.cs#L301-L337","documentation":"RemoveFieldFromPartAsync detaches a field from a part, but first checks the part definition's ContentSettings and throws InvalidOperationException if the part IsSystemDefined. Fields belonging to system-defined parts are protected from removal.","triggerScenarios":"Calling RemoveFieldFromPartAsync(fieldName, partName) — directly or via RemovePartAsync, which removes all fields of the part first — where the part's ContentSettings.IsSystemDefined is true.","commonSituations":"Wiping all fields from a part in a migration; trying to strip fields from a built-in part like TitlePart; generic cleanup loops over part.Fields.","solutions":["Check partDefinition.GetSettings<ContentSettings>().IsSystemDefined before removing fields and skip system parts.","Only remove fields your own module added to the part definition.","For system parts, leave their fields intact; adjust behavior through the part's settings instead."],"exampleFix":"// before\nforeach (var field in partDefinition.Fields)\n    await contentDefinitionService.RemoveFieldFromPartAsync(field.Name, partName);\n// after\nif (!partDefinition.GetSettings<ContentSettings>().IsSystemDefined)\n    foreach (var field in partDefinition.Fields)\n        await contentDefinitionService.RemoveFieldFromPartAsync(field.Name, partName);","handlingStrategy":"validation","validationCode":"// C#\nvar partDef = await contentDefinitionManager.LoadPartDefinitionAsync(partName);\nbool fieldsRemovable = partDef is null || !partDef.GetSettings<ContentSettings>().IsSystemDefined;","typeGuard":"static bool CanRemoveFields(ContentPartDefinition partDef) =>\n    partDef is not null && !partDef.GetSettings<ContentSettings>().IsSystemDefined;","tryCatchPattern":"try\n{\n    await contentDefinitionService.RemoveFieldFromPartAsync(fieldName, partName);\n}\ncatch (InvalidOperationException)\n{\n    // system-defined part: fields are protected\n}","preventionTips":["Check IsSystemDefined before iterating part.Fields to remove them.","Restrict field removal to parts your module owns.","Treat system part fields as read-only configuration."],"tags":["contenttypes","system-defined","fields"],"backgroundTag":"unsupported-operation","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"}