2016-02-12 2 views
3

У меня есть модель источника определяется какAutoMapper один источник объекта многократным назначения объектов

public class SourceRoot 
{ 
    ... 
    public Organisation Organisation { get; set; } 
    ... 
} 

public class Organisation 
{ 
    public long? Id { get; set; } 
    public string Name { get; set; }  
    public string Currency { get; set; } 
    public double SupplementaryAmount { get; set; } 
    public decimal BaseConversionRate { get; set; } 
} 

и назначения определяется как:

public class DestinationRoot 
{ 
    ... 
    public Organisation Organisation { get; set; } 
    public ContributesTo ContributesTo { get; set; } 
} 

public class Organisation 
{ 
    public long? Id { get; set; } 
    public string Name { get; set; }   
} 

public class ContributesTo 
{ 
    public string Currency { get; set; } 
    public double SupplementaryAmount { get; set; } 
    public decimal BaseConversionRate { get; set; } 
} 

Я хочу карту от SourceRoot к DestinationRoot добавьте копию из источника Organisation в пункт назначения Organisation И ContributesTo.

Я имею следующую конфигурацию AutoMapper:

public static class AutoMapperConfig 
{ 
    public static MapperConfiguration RegisterMappings() 
    { 
     var config = new MapperConfiguration(cfg => 
      { 
       cfg.AddProfile<MyProfile>(); 
      }); 

     return config; 
    } 
} 

public class MyProfile : Profile 
{ 
    protected override void Configure() 
    { 
     this.CreateMap<SourceRoot, DestinationRoot>();   
     this.CreateMap<Source.Organisation, Destination.Organisation>(); 
     this.CreateMap<Source.Organisation, Destination.ContributesTo>(); 
    } 
} 

Используя этот текущий профиль по Organisation получает переведенный но ContributesTo выходит как нуль. Обратите внимание, что я использую версию 4.2 AutoMapper, в которой статические методы устарели, поэтому старайтесь избегать этого. Обычно я хотел бы сделать:

Mapper.CreateMap<SourceRoot, DestinationRoot>() 
      .ForMember(d => d.ContributesTo, opt => opt.MapFrom(s=> Mapper.Map<ContributesTo>(s.Organisation))); 

Но это не рекомендуется больше (ссылки на статические методы). Есть ли альтернативный способ сделать это?

Благодаря

ответ

1

Просто добавьте отображение для элемента ContributesTo назначения:

protected override void Configure() 
{ 
    CreateMap<Source.SourceRoot, Destination.DestinationRoot>() 
     .ForMember(d => d.ContributesTo, opt => opt.MapFrom(s => s.Organisation)); 

    CreateMap<Source.Organisation, Destination.Organisation>(); 
    CreateMap<Source.Organisation, Destination.ContributesTo>(); 
} 

В противном случае Automapper находит, что оба источника и места назначения корни имеют свойство Organisation и отображает только этот объект. Automapper не может понять, что он должен использовать одно свойство источника для сопоставления нескольких свойств назначения (которые не совпадают по имени). Обратите внимание, что вам не нужно указывать сопоставление для члена Organisation, поскольку оно соответствует имени свойства в целевом объекте.

+1

Это одна из тех вещей, которые вы слишком усердно пытаетесь найти решение (например, я пытался сделать карту для него), когда ответ действительно прост! Спасибо за это! – ADringer

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