{"record":{"id":"7e0fc77d7409fa83","repo":"DapperLib/Dapper","slug":"constructor-parameter-not-found-for-name","errorCode":null,"errorMessage":"Constructor parameter not found for {name}","messagePattern":"Constructor parameter not found for (.+?)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"Dapper/DefaultTypeMap.cs","lineNumber":139,"sourceCode":"            {\r\n                return withAttr[0];\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets mapping for constructor parameter\r\n        /// </summary>\r\n        /// <param name=\"constructor\">Constructor to resolve</param>\r\n        /// <param name=\"columnName\">DataReader column name</param>\r\n        /// <returns>Mapping implementation</returns>\r\n        public SqlMapper.IMemberMap GetConstructorParameter(ConstructorInfo constructor, string columnName)\r\n        {\r\n            var param = MatchFirstOrDefault(constructor.GetParameters(), columnName, static p => p.Name) ?? Throw(columnName);\r\n            return new SimpleMemberMap(columnName, param);\r\n\r\n            static ParameterInfo Throw(string name) => throw new ArgumentException(\"Constructor parameter not found for \" + name);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets member mapping for column\r\n        /// </summary>\r\n        /// <param name=\"columnName\">DataReader column name</param>\r\n        /// <returns>Mapping implementation</returns>\r\n        public SqlMapper.IMemberMap? GetMember(string columnName)\r\n        {\r\n            var property = MatchFirstOrDefault(Properties, columnName, static p => p.Name);\r\n\r\n            if (property is not null)\r\n                return new SimpleMemberMap(columnName, property);\r\n\r\n            // roslyn automatically implemented properties, in particular for get-only properties: <{Name}>k__BackingField;\r\n            var backingFieldName = \"<\" + columnName + \">k__BackingField\";\r\n\r\n            // preference order is:\r","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/DapperLib/Dapper/blob/72a54c475f75e18cb93cba0809d00a5e6e49efd9/Dapper/DefaultTypeMap.cs#L121-L157","documentation":"DefaultTypeMap.GetConstructorParameter throws ArgumentException(\"Constructor parameter not found for {name}\") when none of a constructor's parameters match the supplied columnName (via MatchFirstOrDefault over parameter names). This fires during constructor-based materialization when Dapper selected a constructor but the reader's column name has no matching parameter name (case-insensitive).","triggerScenarios":"Materializing into a type whose only constructor has parameter names that do not align with the query's column names; a SQL column was renamed/aliased so it no longer matches the constructor parameter; selecting a type whose constructor has parameters without matching columns.","commonSituations":"Changing a stored procedure or SELECT column list without updating the DTO constructor; using column aliases (e.g. \"user_id\") that differ from constructor parameter names (e.g. \"id\"); constructor injection where one parameter has no database equivalent.","solutions":["Align the SQL column alias with the constructor parameter name (e.g. SELECT id AS UserId when the parameter is userId).","Provide a parameterless constructor plus settable properties, or add an explicit constructor whose parameters all map to query columns.","Use a CustomPropertyTypeMap or DefaultTypeMap variant that tolerates missing columns if appropriate."],"exampleFix":"-- before\nSELECT user_id, name FROM Users\n// ctor: public User(int userId, string name)\n\n-- after\nSELECT user_id AS userId, name FROM Users","handlingStrategy":"validation","validationCode":"// before querying, confirm each constructor parameter has a matching column alias\nvar ctorParams = typeof(T).GetConstructors().SelectMany(c => c.GetParameters()).Select(p => p.Name);\n// ensure your SELECT list includes a column name matching each (case-insensitive)","typeGuard":null,"tryCatchPattern":"try { var data = cnn.Query<T>(sql); }\ncatch (ArgumentException ex) when (ex.Message.StartsWith(\"Constructor parameter not found\"))\n{ /* align column alias with the constructor parameter name */ }","preventionTips":["Keep constructor parameter names in sync with SELECT column aliases.","Prefer a parameterless constructor + settable properties for flexible mapping."],"tags":["type-map","constructor-binding","column-mapping","materialization"],"backgroundTag":null,"analyzedSha":"72a54c475f75e18cb93cba0809d00a5e6e49efd9","analyzedAt":"2026-08-13T14:18:18.115Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}