AutoMapper не копирует автоматически столбец идентификатора с тем же именем - PullRequest
0 голосов
/ 30 октября 2018

AutoMapper 7.0.1

Нашел интересную проблему, которую я не смог объяснить. При отображении модели представления обратно в объект сущности БД свойство Id не отображается и всегда равно 0, если я явно не установил его MapFrom в определении CreateMap.

В базе данных столбец TimeDetail.Id - это столбец с автоинкрементом, но я не знаю, как это узнает автопроизводитель ... но это была единственная причина, о которой я мог подумать. Кроме того, это для случаев обновления существующего TimeDetail.

Отладчик, показывающий идентификатор, заполняется в viewModel: enter image description here

Отладчик, показывающий объектный объект, который был отображен из автоматического средства с Id = 0: enter image description here

Выражение карты:

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;
    }        
}

1 Ответ

0 голосов
/ 31 октября 2018

Нашел ответ. Это было связано с ложными срабатываниями в моем IgnoreAllVirtual методе расширения, как было найдено в ответе @Alexei на этот пост .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...