AutoMapper 7.0.1
Нашел интересную проблему, которую я не смог объяснить. При отображении модели представления обратно в объект сущности БД свойство Id не отображается и всегда равно 0, если я явно не установил его MapFrom в определении CreateMap
.
В базе данных столбец TimeDetail.Id
- это столбец с автоинкрементом, но я не знаю, как это узнает автопроизводитель ... но это была единственная причина, о которой я мог подумать. Кроме того, это для случаев обновления существующего TimeDetail.
Отладчик, показывающий идентификатор, заполняется в viewModel:
Отладчик, показывающий объектный объект, который был отображен из автоматического средства с Id = 0:
Выражение карты:
var entity = Mapper.Map<TimeDetail>(viewModel);
Объект класса таблицы БД:
public partial class TimeDetail
{
public int Id { get; set; }
....other columns
}
Просмотр модели:
public class TimeDetailsListViewModel
{
public int Id { get; set; }
... other columns
}
Карта:
CreateMap<TimeDetailsListViewModel, TimeDetail>(MemberList.Destination).IgnoreAllVirtual()
.ForMember(dest => dest.Id, c => c.MapFrom(m => m.Id)) <---- Id is 0 if I don't explicitly set the map using this
.ForMember(dest => dest.StartDateTime, c => c.MapFrom(m => TimeUtilities.ConvertToUTCDateTime(m.StartDateTime).Value))
.ForMember(dest => dest.EndDateTime, c => c.MapFrom(m => TimeUtilities.ConvertToUTCDateTime(m.EndDateTime)))
;
Метод расширения IgnoreAllVirtual:
public static class AutoMapperExtensions
{
public static IMappingExpression<TSource, TDestination>IgnoreAllVirtual<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> expression)
{
var desType = typeof(TDestination);
foreach (var property in desType.GetProperties().Where(p =>
p.GetGetMethod().IsVirtual))
{
expression.ForMember(property.Name, opt => opt.Ignore());
}
return expression;
}
}