@@ -164,13 +164,25 @@ public SqlMapper.IMemberMap GetMember(string columnName)
164
164
if ( property != null )
165
165
return new SimpleMemberMap ( columnName , property ) ;
166
166
167
+ // roslyn automatically implemented properties, in particular for get-only properties: <{Name}>k__BackingField;
168
+ var backingFieldName = $ "<{ columnName } >k__BackingField";
169
+
170
+ // preference order is:
171
+ // exact match over underscre match, backing fields over regular fields, exact case over wrong case
167
172
var field = _fields . FirstOrDefault ( p => string . Equals ( p . Name , columnName , StringComparison . Ordinal ) )
168
- ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , columnName , StringComparison . OrdinalIgnoreCase ) ) ;
173
+ ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , columnName , StringComparison . OrdinalIgnoreCase ) )
174
+ ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , backingFieldName , StringComparison . Ordinal ) )
175
+ ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , backingFieldName , StringComparison . OrdinalIgnoreCase ) ) ;
169
176
170
177
if ( field == null && MatchNamesWithUnderscores )
171
178
{
172
- field = _fields . FirstOrDefault ( p => string . Equals ( p . Name , columnName . Replace ( "_" , "" ) , StringComparison . Ordinal ) )
173
- ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , columnName . Replace ( "_" , "" ) , StringComparison . OrdinalIgnoreCase ) ) ;
179
+ var effectiveColumnName = columnName . Replace ( "_" , "" ) ;
180
+ backingFieldName = $ "<{ effectiveColumnName } >k__BackingField";
181
+
182
+ field = _fields . FirstOrDefault ( p => string . Equals ( p . Name , effectiveColumnName , StringComparison . Ordinal ) )
183
+ ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , effectiveColumnName , StringComparison . OrdinalIgnoreCase ) )
184
+ ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , backingFieldName , StringComparison . Ordinal ) )
185
+ ?? _fields . FirstOrDefault ( p => string . Equals ( p . Name , backingFieldName , StringComparison . OrdinalIgnoreCase ) ) ;
174
186
}
175
187
176
188
if ( field != null )
0 commit comments