2014-09-14 2 views
1

Ниже приведены мои классыAutoMapper Условный Mapping не работает с Skipping Null назначения Значения

public class Student { 
     public long Id { get; set; } 
     public long? CollegeId { get; set; } 
     public StudentPersonal StudentPersonal { get; set; } 
    } 

    public class StudentPersonal { 
     public long? EthnicityId { get; set; } 
     public bool? GenderId { get; set; } // doesn't exist on UpdateModel, requires PropertyMap.SourceMember null check 
    } 

    public class UpdateModel{ 
     public long Id { get; set; } 
     public long? CollegeId { get; set; } 
     public long? StudentPersonalEthnicityId { get; set; } 
    } 

Ниже AutoMapper конфигурации

Mapper.Initialize(a => { 
    a.RecognizePrefixes("StudentPersonal"); 
} 

Mapper.CreateMap<UpdateModel, StudentPersonal>() 
    .ForAllMembers(opt => opt.Condition(src => src.PropertyMap.SourceMember != null && src.SourceValue != null)); 
Mapper.CreateMap<UpdateModel, Student>() 
    .ForMember(dest => dest.StudentPersonal, opt => opt.MapFrom(src => Mapper.Map<StudentPersonal>(src)))         
    .ForAllMembers(opt => opt.Condition(src => src.PropertyMap.SourceMember != null && src.SourceValue != null)); 

И испытуемый образец случай:

var updateModel = new StudentSignupUpdateModel(); 
updateModel.Id = 123; 
updateModel.CollegeId = 456; 
updateModel.StudentPersonalEthnicityId = 5; 

var existingStudent = new Student(); 
existingStudent.Id = 123; 
existingStudent.CollegeId = 777; // this gets updated 
existingStudent.StudentPersonal = new StudentPersonal(); 
existingStudent.StudentPersonal.EthnicityId = null; // this stays null but shouldn't 

Mapper.Map(updateModel, existingStudent); 
Assert.AreEqual(777, existingStudent.CollegeId); // passes 
Assert.AreEqual(5, existingStudent.StudentPersonal.EthnicityId); // does not pass 

Имеет Кто-нибудь получил условное сопоставление для работы с префиксами? Он работает нормально на объекте без префикса.

ответ

0

Лямбды вы передаете к opts.Condition слишком ограничительный:

src => src.PropertyMap.SourceMember != null && src.SourceValue != null 

В случае этого имущества, src.PropertyMap является null каждый раз (который можно было бы ожидать, так как нет ни одного свойства, которое отображает до места назначения вложено свойство из исходного объекта).

Если вы удалите PropertyMap.SourceMember чек, ваши тесты пройдут. Я не уверен, какое влияние это повлияет на остальную часть вашего картографирования.

+0

Спасибо за ответ. Проблема здесь в том, что на стороне назначения есть поля, которые не существуют на стороне источника, что вызвало у меня проблему. Я отредактировал оригинальный пример для иллюстрации. Мысли? –