AutoMapper: UseValue vs ResolveUsing vs MapFrom
I just hit a confusing mapping bug whilst using AutoMapper to map DateTime.Now to a field in my database. Every item that was being added to the database had the same value in the "DateAdded" - to the millisecond. This was because I was using the following mapping expression:
Mapper.CreateMap<SourceObject, DestObject>() .ForMember(m => m.DateAdded, o => o.UseValue(DateTime.Now));
UseValue() retrieves a value on first-run and stores it in the mapping (hence the static DateTime value that's being stored in the database), whereas ResolveUsing() resolves at run-time - which is obviously why it's called ResolveUsing(). A minor oversight, but confusing nonetheless.
Use ResolveUsing(s => {}) when you want to resolve a destination field from a derived value. This should be used for any DateTime mappings, and any more complicated mapping functions.Use MapFrom(s => s.MemberName) when you return an actual source object member.Use UseValue() if you want to map a …
Mapper.CreateMap<SourceObject, DestObject>() .ForMember(m => m.DateAdded, o => o.UseValue(DateTime.Now));
UseValue() retrieves a value on first-run and stores it in the mapping (hence the static DateTime value that's being stored in the database), whereas ResolveUsing() resolves at run-time - which is obviously why it's called ResolveUsing(). A minor oversight, but confusing nonetheless.
Use ResolveUsing(s => {}) when you want to resolve a destination field from a derived value. This should be used for any DateTime mappings, and any more complicated mapping functions.Use MapFrom(s => s.MemberName) when you return an actual source object member.Use UseValue() if you want to map a …