{"record":{"id":"a57182d4fd94f52f","repo":"PrismLibrary/Prism","slug":"resources-mappingexistsexception","errorCode":null,"errorMessage":"Resources.MappingExistsException","messagePattern":"Resources\\.MappingExistsException","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Wpf/Prism.Wpf/Navigation/Regions/RegionAdapterMappings.cs","lineNumber":30,"sourceCode":"        private readonly Dictionary<Type, IRegionAdapter> mappings = new Dictionary<Type, IRegionAdapter>();\n\n        /// <summary>\n        /// Registers the mapping between a type and an adapter.\n        /// </summary>\n        /// <param name=\"controlType\">The type of the control.</param>\n        /// <param name=\"adapter\">The adapter to use with the <paramref name=\"controlType\"/> type.</param>\n        /// <exception cref=\"ArgumentNullException\">When any of <paramref name=\"controlType\"/> or <paramref name=\"adapter\"/> are <see langword=\"null\" />.</exception>\n        /// <exception cref=\"InvalidOperationException\">If a mapping for <paramref name=\"controlType\"/> already exists.</exception>\n        public void RegisterMapping(Type controlType, IRegionAdapter adapter)\n        {\n            if (controlType == null)\n                throw new ArgumentNullException(nameof(controlType));\n\n            if (adapter == null)\n                throw new ArgumentNullException(nameof(adapter));\n\n            if (mappings.ContainsKey(controlType))\n                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,\n                                                                  Resources.MappingExistsException, controlType.Name));\n\n            mappings.Add(controlType, adapter);\n        }\n\n        /// <summary>\n        /// Registers the mapping between a type and an adapter.\n        /// </summary>\n        /// <typeparam name=\"TControl\">The type of the control</typeparam>\n        public void RegisterMapping<TControl>(IRegionAdapter adapter)\n        {\n            RegisterMapping(typeof(TControl), adapter);\n        }\n\n        /// <summary>\n        /// Registers the mapping between a type and an adapter.\n        /// </summary>\n        /// <typeparam name=\"TControl\">The type of the control</typeparam>","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/PrismLibrary/Prism/blob/358118cd640d9a22ff8cf21c8ad197fa038b7990/src/Wpf/Prism.Wpf/Navigation/Regions/RegionAdapterMappings.cs#L12-L48","documentation":"RegionAdapterMappings.RegisterMapping throws InvalidOperationException formatted with MappingExistsException when an adapter mapping for the given controlType already exists. Each control type can be mapped to exactly one IRegionAdapter.","triggerScenarios":"Calling RegisterMapping(typeof(SameControl), adapter) twice — e.g. registering a custom adapter in App while a base module/library already registered one for the same type.","commonSituations":"Two modules each registering an adapter for the same control type during module initialization; duplicate adapter registration code left after a refactor; re-running initialization logic (app restart in-process, repeated ConfigureDefaultRegionAdapterMappings).","solutions":["Register the custom adapter only once, in one place (e.g. App.CreateContainer/ConfigureDefaultRegionAdapterMappings override), removing duplicates from modules.","If overriding is intended, avoid mapping for an already-mapped type or restructure so your adapter replaces the default during the single registration point.","Track registration with a flag/HashSet so repeated initialization doesn't call RegisterMapping again."],"exampleFix":"// before\nmappings.RegisterMapping(typeof(TabControl), myAdapter); // may run twice\n// after\nif (!mappings.HasMapping(typeof(TabControl))) // guard, or ensure single registration point\n    mappings.RegisterMapping(typeof(TabControl), myAdapter);","handlingStrategy":"validation","validationCode":"if (mappings.GetMappingOrDefault(controlType) != null)\n    return; // already registered\nmappings.RegisterMapping(controlType, adapter);","typeGuard":null,"tryCatchPattern":"try\n{\n    mappings.RegisterMapping(controlType, adapter);\n}\ncatch (InvalidOperationException)\n{\n    // mapping already exists — skip or remove old mapping first\n}","preventionTips":["Register adapters in exactly one place (App bootstrapper).","Don't register adapters per-module; use a shared registration sequence.","Guard repeated initialization with an idempotency flag."],"tags":["wpf","prism","region-adapter","duplicate","mapping"],"backgroundTag":"file-already-exists","analyzedSha":"358118cd640d9a22ff8cf21c8ad197fa038b7990","analyzedAt":"2026-09-15T15:00:31.079Z","contentChangedAt":"2026-09-15T15:00:31.079Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}