1

Я попытался много искать и попробовать разные варианты, но ничего не работает.AutoMapper: сохранить значение назначения, если свойство не существует в источнике

Я использую ASP.net Identity 2.0, и у меня есть UpdateProfileViewModel. При обновлении информации о пользователе я хочу сопоставить модуль UpdateProfileViewModel с ApplicationUser (т. Е. Модель идентификации); но я хочу сохранить значения, которые я получил из db для пользователя. то есть имя пользователя & Адрес электронной почты, который не нуждается в изменении.

Я пытался делать:

Mapper.CreateMap<UpdateProfileViewModel, ApplicationUser>() 
.ForMember(dest => dest.Email, opt => opt.Ignore()); 

, но я все еще получаю Email утратившим после отображения:

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 
user = Mapper.Map<UpdateProfileViewModel, ApplicationUser>(model); 

Я также попытался это, но не работает:

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) 
    { 
     var sourceType = typeof(TSource); 
     var destinationType = typeof(TDestination); 
     var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType) && x.DestinationType.Equals(destinationType)); 
     foreach (var property in existingMaps.GetUnmappedPropertyNames()) 
     { 
      expression.ForMember(property, opt => opt.Ignore()); 
     } 
     return expression; 
    } 

и затем:

Mapper.CreateMap<UpdateProfileViewModel, ApplicationUser>() 
.IgnoreAllNonExisting(); 
+0

Try «UseDestinationValue» вместо «Игнорировать» –

+0

Это еще остается неизменным в объекте пользователя. –

ответ

3

Все, что вам нужно, это создать отображение между вашими типами источника и назначения:

Mapper.CreateMap<UpdateProfileViewModel, ApplicationUser>(); 

, а затем выполнить отображение:

UpdateProfileViewModel viewModel = ... this comes from your view, probably bound 
ApplicationUser user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 
Mapper.Map(viewModel, user); 

// at this stage the user domain model will only have the properties present 
// in the view model updated. All the other properties will remain unchanged 
// You could now go ahead and persist the updated 'user' domain model in your 
// datastore 
+1

Он скопирует их, предположив, что у вас есть те же имена и типы свойств в вашей модели домена. –

+1

Тогда я полагаю, вы делаете что-то неправильно, а не то, как я показал в своем ответе. Метод 'Mapper.Map' **, как показано в моем ответе **, скопирует все значения свойств, присутствующие в исходном объекте, в объект назначения, не затрагивая никаких других свойств объекта dest. –

+0

Вы правы. Я прошу прощения. Я не заметил, что я должен удалить из метода Map. Спасибо lotttttt. Я удалил свои комментарии, поэтому любой будущий пользователь не ошибается. –

 Смежные вопросы

  • Нет связанных вопросов^_^