I have simple task: just map one class to another. For some fields I have complex logic, depends on 2 or more fields, so, I try to use ConvertUsing
(https://docs.automapper.org/en/stable/Custom-type-converters.html)
I use AutoMapper 10.0.0
My code is:
Source class:
public class DeviceStatusHistory
{
public DeviceStatusHistory()
{
DateChange = DateTime.UtcNow;
}
public int Id { get; set; }
public int DeviceId { get; set; }
public virtual Device Device { get; set; }
public int? RequestId { get; set; }
public virtual DeviceManagementRequest Request { get; set; }
public DeviceStatus OldStatus { get; set; }
public DeviceStatus NewStatus { get; set; }
public string Notes { get; set; }
public DateTime DateChange { get; set; }
}
DTO class:
public class DeviceChangeStatusDto
{
public int DeviceId { get; set; }
public string CarrierName { get; set; }
public string DeviceName { get; set; }
public string DeviceIMEI { get; set; }
public string OldStatus { get; set; }
public string NewStatus { get; set; }
public string Reason { get; set; }
public DateTime DateChange { get; set; }
}
and Automapper class:
public class AutoMapperEfDeviceManagement : AutoMapper.Profile
{
public AutoMapperEfDeviceManagement()
{
CreateMap<DeviceStatusHistory, DeviceChangeStatusDto>().ConvertUsing<DeviceChangeStatusConverter>();
}
}
where DeviceChangeStatusConverter
is defined as:
public class DeviceChangeStatusConverter : ITypeConverter<DeviceStatusHistory, DeviceChangeStatusDto>
{
public DeviceChangeStatusDto Convert(DeviceStatusHistory source, DeviceChangeStatusDto destination, ResolutionContext context)
{
destination = new DeviceChangeStatusDto
{
CarrierName = source.Device.CarrierId.HasValue ? source.Device.Carrier.Name : null,
DeviceId = source.DeviceId,
DateChange = source.DateChange,
DeviceIMEI = source.Device.IMEI,
DeviceName = source.Device.GetFriendlyDetailedName(),
NewStatus = CommonHelper.SplitByWords(source.NewStatus.ToString())
};
// some complex logic here
return destination;
}
}
but when I try to map it:
var list = _context.DeviceStatusHistory
.Where(a => ((int)a.NewStatus < 100) && a.DateChange.Date == date.Date)
.ProjectTo<DeviceChangeStatusDto>(_mapperConfig)
.ToList();
where _mapperConfig
is:
_mapperConfig = new MapperConfiguration(cfg =>
{
cfg.AddProfile<AutoMapperEfDeviceManagement>();
});
It maps looks like it was declared simple as :
CreateMap<DeviceStatusHistory, DeviceChangeStatusDto>();
so, only the same properties are mapped, converter is not called (debugger says the same). What is wrong?
ADDED:
approach like:
CreateMap<DeviceStatusHistory, DeviceChangeStatusDto>()
.ConvertUsing((source, destination) =>
{
destination.CarrierName = source.Device.CarrierId.HasValue ? source.Device.Carrier.Name : null;
does not work too