2014-09-14 2 views
1

Целью здесь является игнорировать значения нулевого источника, не требуя, чтобы исходный объект имел все поля, которые имеет объект назначения. Предотвращение нулевой видимости работает только в том случае, если все поля соответствуют объектам.AutoMapper не может предотвратить значения нулевого источника, если не все свойства источника соответствуют

public class ApiStudent { 
    public long Id { get; set; } 
    public string Name { get; set; }  
} 

public class DomainStudent { 
    public long Id { get; set; } 
    public string Name { get; set; } 
    public long SchoolId { get; set; } 
} 

Когда я запускаю следующее отображение:

Mapper.CreateMap<ApiStudent, DomainStudent>() 
    .ForAllMembers(opt => opt.Condition(src => !src.IsSourceValueNull)); 

var api = new ApiStudent(); 
api.Id = 123; 
api.Name = null; 

var domain = new DomainStudent(); 
domain.Id = 123; 
domain.Name = "Homer Simpson"; // goal is to prevent this from being written to null 

domain = Mapper.Map(api, domain); 
// I get an error here saying the SchoolId mapping is missing from ApiStudent 

Если я удалить ".ForAllMembers (! Неавтоматического => opt.Condition (SRC => src.IsSourceValueNull));" из определения Mapping, я не получаю ошибку, но тогда свойство .Name будет перезаписано до нуля. Что мне здесь не хватает, чтобы заставить AutoMapper пропускать свойства, существующие на целевом объекте, но не исходный объект?

ответ

7

Это решило это!

https://github.com/AutoMapper/AutoMapper/issues/432

Цитируя статью

Мы просто повышен с 3.0.0 до 3.1.0 и начал получать проблемы с отображений со следующим определением:

.ForAllMembers (о = > o.Condition (c =>! c.IsSourceValueNull)); Это было , ранее работающее правильно и не будет пытаться отображать свойства, которые не имеют значения источника. После обновления, кажется, что Automapper, столкнувшись с участком назначения, который имеет , не соответствует исходному элементу, попытается отобразить из источника в пункт назначения. Затем это генерирует исключение сопоставления, поскольку не определено определение отображения для типа источника для любого из типов свойств назначения . Ранее Automapper, казалось, справедливо игнорировал элементы, у которых не было соответствующего исходного элемента.

We changed the condition line to: 

.ForAllMembers(o => o.Condition(c => c.PropertyMap.SourceMember != null && !c.IsSourceValueNull)); 
+0

Благодаря мате - только то, что я искал. – Brendan

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