2016-01-20 2 views
3

Я пытаюсь отобразить объекты одного типа, которые имеют набор дочерних объектов, и я обнаружил, что Ignore(), примененный к свойствам дочернего объекта, кажется, umm ... игнорируется!AutoMapper Игнорировать на свойство дочерней коллекции

Вот примерный тест, который демонстрирует проблему.

class A 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<B> Children { get; set; } 
} 

class B 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

[TestClass] 
public class UnitTest1 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     Mapper.CreateMap<A, A>() 
      .ForMember(dest => dest.Id, opt => opt.Ignore()); 

     Mapper.CreateMap<B, B>() 
      .ForMember(dest => dest.Id, opt => opt.Ignore()); 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     A src = new A { Id = 0, Name = "Source", Children = new List<B> { new B { Id = 0, Name = "Child Src" } } }; 
     A dest = new A { Id = 1, Name = "Dest", Children = new List<B> { new B { Id = 11, Name = "Child Dest" } } }; 

     Mapper.Map(src, dest); 

    } 

После карте называют свойство Id Объект находится еще один, как и ожидалось, но свойство Id дочернего B объекта изменяется от 11 до 0.

Почему?

ответ

6

В AutoMapper 4.1.1 имеется несколько ошибок.

Первая около UseDestinationValue: https://github.com/AutoMapper/AutoMapper/issues/568

секундной о вложенных коллекциях: https://github.com/AutoMapper/AutoMapper/issues/934

Ужасающие! Чтобы обойти эту проблему, чтобы сопоставить B экземпляры непосредственно:

Mapper.CreateMap<A, A>() 
    .ForMember(dest => dest.Id, opt => opt.Ignore()) 
    .ForMember(dest => dest.Children, opt => opt.Ignore()); 

Mapper.CreateMap<B, B>() 
    .ForMember(dest => dest.Id, opt => opt.Condition((ResolutionContext src) => false)); 

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

Mapper.Map(src, dest); 
Mapper.Map(src.Children.First(), dest.Children.First()); //example!!! 

Вы можете позвонить Mapper.Map в цикле:

for (int i = 0; i < src.Children.Count; i++) 
{ 
    var srcChild = src.Children[i]; 
    var destChild = dest.Children[i]; 

    Mapper.Map(srcChild, destChild); 
} 

Это будет делать вещи правильно работать ,

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