2014-11-05 1 views
3

Хорошо, я надеюсь, что я просто как-то игнорирую очевидное. Ниже приведена следующая ситуация с кодом. По какой-то причине свойство SequenceNo по-прежнему отображается, хотя я вызываю Ignore(). Я использую последнее. Я также тестировал его с двумя разными классами в одном проекте, и, похоже, он работал, поэтому что случилось с этим сценарием?AutoMapper Ignore() Issue

Это объект домена:

public class CableID 
{ 
    private string _panelID1; 
    public string PanelID1 
    { 
     get { return _panelID1; } 
     private set { _panelID1 = value; } 
    } 

    private string _panelID2; 
    public string PanelID2 
    { 
     get { return _panelID2; } 
     private set { _panelID2 = value; } 
    } 

    private int _sequenceNo; 
    public int SequenceNo 
    { 
     get { return _sequenceNo; } 
     private set { _sequenceNo = value; } 
    } 

    private DateTime _inService; 
    public DateTime InService 
    { 
     get { return _inService; } 
     set { _inService = value; } 
    } 

    private string _id; 
    public string ID 
    { 
     get { return _id; } 
     private set { _id = value; } 
    } 

    public CableID(string panelID1, string panelID2, int sequenceNo) 
    { 
     this.PanelID1 = panelID1; 
     this.PanelID2 = panelID2; 
     this.SequenceNo = sequenceNo; 
     this.ID = string.Format("({0}-{1}){2}", this.PanelID1, this.PanelID2, this.SequenceNo); 
    } 

    public CableID(string id) 
    { 
     if (string.IsNullOrEmpty(id)) 
      throw new ArgumentNullException("id"); 

     this.ID = id; 
    } 
} 

А вот DTO объекта:

public class CableIDDTO 
{ 
    private string _panelID1; 
    public string PanelID1 
    { 
     get { return _panelID1; } 
     set { _panelID1 = value; } 
    } 

    private string _panelID2; 
    public string PanelID2 
    { 
     get { return _panelID2; } 
     set { _panelID2 = value; } 
    } 

    private int _sequenceNo; 
    public int SequenceNo 
    { 
     get { return _sequenceNo; } 
     set { _sequenceNo = value; } 
    } 

    private string _id; 
    public string ID 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    public CableIDDTO() 
    { } 

    public CableIDDTO(string panelID1, string panelID2, int sequenceNo) 
    { 
     this.PanelID2 = panelID1; 
     this.PanelID1 = panelID2; 
     this.SequenceNo = sequenceNo; 
     this.ID = string.Format("({0}-{1}){2}", this.PanelID2, this.PanelID1, this.SequenceNo); 
    } 
} 

И, наконец, AutoMapper вариант использования:

 CableID cableID = new CableID("A1", "B1", 2); 
     Mapper.CreateMap<CableID, CableIDDTO>() 
       .ForMember(dest => dest.SequenceNo, opt => opt.Ignore()); 

     CableIDDTO dto = Mapper.Map<CableID, CableIDDTO>(cableID); 

dto.SequenceNo = 2, когда, так как я установил Пропускать() должно быть 0.

ответ

5

Это потому, что AutoMapper находит этот CableIDDTO конструктор:

public CableIDDTO(string panelID1, string panelID2, int sequenceNo) 

и назвав его, установив sequenceNo. Я не совсем уверен, как и почему он это делает - я продолжу копать.

Вы можете исправить это, вызывая .ConstructUsing и говорить AutoMapper использовать конструктор без ARGS:

Mapper.CreateMap<CableID, CableIDDTO>() 
    .ConstructUsing((Func<CableID, CableIDDTO>)(src => new CableIDDTO())) 
    .ForMember(dest => dest.SequenceNo, opt => opt.Ignore()); 

После дальнейших исследований, это выглядит как особенность в AutoMapper, которая пытается совпасть имена источника собственности с назначением конструкторы. Поскольку у вашего типа назначения (CableIDDTO) был конструктор, который идеально соответствовал нескольким именам свойств в источнике (panelID1, panelID2, sequenceNo), этот конструктор был вызван.

Другой способ отключить эту функцию, чтобы позвонить DisableConstructorMapping:

Mapper.Configuration.DisableConstructorMapping() 
+0

Вы прибил его! Это было неинтуитивно и честно не имеет большого смысла. Почему он захватывает тот, когда доступен конструктор без параметров? Что, если было три или четыре перегруженных конструктора? – bjhuffine

+0

Я не уверен - сегодня я займу некоторое время и просмотрю исходный код AutoMapper, чтобы узнать, могу ли я узнать –

+0

@bjhuffine: добавлена ​​еще одна информация, надеюсь, что это поможет. Я понятия не имел, что существовал до твоего вопроса! –