Automapper: обновление значений свойств без создания нового объекта


260

Как я могу использовать automapper для обновления значений свойств другого объекта, не создавая новый?

Ответы:


456

Используйте перегрузку, которая принимает существующее назначение:

Mapper.Map<Source, Destination>(source, destination);

Да, он возвращает целевой объект, но это только для некоторых других непонятных сценариев. Это тот же объект.


28
Спасибо, Джимми ... Я намеренно держался подальше от AutoMapper, потому что боялся, что кривая обучения повлияет на мой график. Мне официально жаль, что я так долго оставался в стороне ... это намного проще, чем я думал.
Нил Т.

13
Automapper должен быть одной из самых полезных библиотек. Я слишком долго избегал этого, слишком долго. Я начал использовать его сегодня и очень удивлен тем, насколько легко им пользоваться.
Маккоттингем

4
Не работа для меня. Я пытаюсь сопоставить с тем же типом, но он возвращает новый объект. Пользователь u1, u3 = новый пользователь (); u1 = новый пользователь {Id = 1, NickName = "vami"}; Пользователь u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Петр

7
К вашему сведению, я обнаружил, что вам не нужно указывать параметры типа. Просто Mapper.Map (источник, место назначения) будет работать. Красиво и просто!
Иуда Габриэль Химанго

2
Изменилось ли поведение NULL в выпуске 4.2.1? Я вижу, что отображение null в объект возвращает null; тогда как в 2.2.1 отображение null в существующий объект вернуло существующий объект.
Питер МакЭвой

18

Чтобы сделать это, вы должны создать CreateMap для типов источника и назначения, даже если они одного типа. Это означает, что если вы хотите, Mapper.Map<User, User>(user1, user2); вам нужно создать карту, как это Mapper.Create<User, User>()


1
Ха! Я только что нашел то же самое и добавил комментарий к принятому ответу. ИМХО, принятый ответ без вашего объяснения
Анджей Мартина

Это отличное дополнение. Однако в первоначальном вопросе не упоминались типы источника и назначения, и не требовалось, чтобы они были одного типа.
Jpaugh

4

Если вы хотите использовать метод экземпляра IMapper, а не статический метод, используемый в принятом ответе, вы можете сделать следующее (проверено в AutoMapper 6.2.2)

IMapper _mapper;
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Destination>();
});
_mapper = config.CreateMapper();

Source src = new Source
{
//initialize properties
}

Destination dest = new dest
{
//initialize properties
}
_mapper.Map(src, dest);

destтеперь будет обновлено со всеми значениями свойств из того, srcчто он поделился. Значения его уникальных свойств останутся прежними.

Вот соответствующий исходный код

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.