{"record":{"id":"620ad2a246673d4a","repo":"TechnitiumSoftware/DnsServer","slug":"the-zone-memberzoneinfo-displayname-is-not-a-m","errorCode":null,"errorMessage":"The zone '<memberZoneInfo.DisplayName>' is not a member of any Catalog zone.","messagePattern":"The zone '<memberZoneInfo\\.DisplayName>' is not a member of any Catalog zone\\.","errorType":"exception","errorClass":"DnsServerException","httpStatus":null,"severity":"error","filePath":"DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs","lineNumber":1888,"sourceCode":"\n                    break;\n\n                default:\n                    throw new NotSupportedException();\n            }\n        }\n\n        public void ChangeCatalogMemberZoneOwnership(AuthZoneInfo memberZoneInfo, string newCatalogZoneName)\n        {\n            switch (memberZoneInfo.Type)\n            {\n                case AuthZoneType.Primary:\n                case AuthZoneType.Secondary:\n                case AuthZoneType.Stub:\n                case AuthZoneType.Forwarder:\n                    string currentCatalogZoneName = memberZoneInfo.ApexZone.CatalogZoneName;\n                    if (currentCatalogZoneName is null)\n                        throw new DnsServerException(\"The zone '\" + memberZoneInfo.DisplayName + \"' is not a member of any Catalog zone.\");\n\n                    AddCatalogMemberZone(newCatalogZoneName, memberZoneInfo, true);\n\n                    if (!memberZoneInfo.Disabled)\n                    {\n                        ApexZone apexZone = _root.GetApexZone(currentCatalogZoneName);\n                        if (apexZone is CatalogZone currentCatalogZone)\n                        {\n                            currentCatalogZone.ChangeMemberZoneOwnership(memberZoneInfo.Name, newCatalogZoneName);\n\n                            //save catalog changes\n                            SaveZoneFile(currentCatalogZone.Name);\n                        }\n                    }\n\n                    break;\n\n                default:","sourceCodeStart":1870,"sourceCodeEnd":1906,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs#L1870-L1906","documentation":"Thrown by ChangeCatalogMemberZoneOwnership when the member zone is not currently attached to any catalog. The method reads memberZoneInfo.ApexZone.CatalogZoneName; if it is null there is no ownership to change, so it refuses.","triggerScenarios":"Calling ChangeCatalogMemberZoneOwnership(memberZoneInfo, newCatalogZoneName) for a zone whose ApexZone.CatalogZoneName is null (never added to a catalog, or already removed). Line 1887 detects null and throws at 1888.","commonSituations":"Calling change-ownership on a freshly created zone that was never added to a catalog. Re-running a migration script after a prior removal. UI offering 'move catalog' for non-member zones.","solutions":["If the zone is not yet a member, call AddCatalogMemberZone(newCatalogZoneName, memberZoneInfo) instead of ChangeCatalogMemberZoneOwnership.","Pre-check memberZoneInfo.ApexZone.CatalogZoneName; if null, route to Add.","Refresh memberZoneInfo before deciding which API to call.","Guard the UI action so 'change ownership' only appears for zones already in a catalog."],"exampleFix":"// before\nmanager.ChangeCatalogMemberZoneOwnership(memberZone, newCatalog); // throws if not a member\n\n// after\nif (string.IsNullOrEmpty(memberZone.ApexZone.CatalogZoneName))\n    manager.AddCatalogMemberZone(newCatalog, memberZone);\nelse\n    manager.ChangeCatalogMemberZoneOwnership(memberZone, newCatalog);","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(memberZone.ApexZone.CatalogZoneName))\n    manager.AddCatalogMemberZone(newCatalogZoneName, memberZone); // add, not change\nelse\n    manager.ChangeCatalogMemberZoneOwnership(memberZone, newCatalogZoneName);","typeGuard":null,"tryCatchPattern":"catch (DnsServerException ex) when (ex.Message.Contains(\"not a member of any\")) { manager.AddCatalogMemberZone(newCatalogZoneName, memberZone); }","preventionTips":["Check CatalogZoneName before choosing Add vs ChangeOwnership.","Only offer 'move catalog' for zones already in a catalog.","Refresh member state before the operation."],"tags":["dns","catalog-zone","membership","state-violation","input-validation"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}