2016-04-18 61 views
0

越來越automapper工作(previous question)後,我與另一個問題所困擾(去到另外一個問題,所以第一個就不會太複雜)...Automapper合併對象問題

我有下一類:

public class Model1 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime BirthDay { get; set; } 
    public int Gender { get; set; } 
    public string NickName { get; set; } 
}  
public class Model2 
{ 
    public bool Married { get; set; }  
    public int Children { get; set; } 
    public bool HasPet { get; set; } 
} 

public class Entity1 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime BirthDay { get; set; } 
    public int Gender { get; set; } 
}  
public class Entity2 
{ 
    public bool Married { get; set; }  
    public int Children { get; set; } 
    public bool HasPet { get; set; } 
    public string NickName { get; set; } 
} 

這些對象是示意性地類似於我原來的對象,除了名稱和複雜性。

而且AutoMapper配置類(從Global.asax中稱爲):

public class AutoMapperConfig 
{ 
    public static MapperConfiguration MapperConfiguration { get; set; } 

    public static void Configure() 
    { 
     MapperConfiguration = new MapperConfiguration(cfg => { 
      cfg.AddProfile<Out>(); 
      cfg.CreateMap<SuperModel, SuperEntity>(); 
     }); 
     MapperConfiguration.AssertConfigurationIsValid(); 
    } 
} 

public class Out: Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Model1, Entity1>(); 
     CreateMap<Model2, Entity2>() 
      .ForMember(dest => dest.NickName, opt => opt.Ignore()); 
     CreateMap<Model1, Entity2>() 
      .ForMember(dest => dest.Married, opt => opt.Ignore()) 
      .ForMember(dest => dest.Children, opt => opt.Ignore()) 
      .ForMember(dest => dest.HasPet, opt => opt.Ignore()); 
     CreateMap<SuperModel, SuperEntity>() 
      .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1)) 
      .ForMember(dest => dest.Entity2, opt => opt.MapFrom(src => src.Model2)); 
    } 
} 

當我需要被轉換的對象,我下一步(在這一點上我已經_superModel初始化,並用數據填充):

SuperEntity _superEntity = new SuperEntity(); 
AutoMapperConfig.MapperConfiguration.CreateMapper().Map<SuperModel, SuperEntity>(_superModel, _superEntity); 

所以,我映射到Model1Entity1(女巫是罰款),也Model2Entity2(女巫也很好,除了ID屬性,它被忽略) 。

主要對象SuperModelSuperEntity也被映射,並且似乎工作正常。

問題發生在我將Model1映射到Entity2時,得到NickName(認爲其餘屬性被忽略)。一些如何總是null

任何想法?

+1

你怎麼樣的地圖? –

+0

@ArturoMenchaca你是對的,我忘了提及它。請再次看到問題 - 只需編輯它。 – neoselcev

回答

1

的問題是要映射從數倍源屬性值(Children,從Model2Model1MarriedHasPetNickname)一個目標屬性(Entity2)。

您可以使用Custom ResolverAfterMap方法解決您的情況。

使用自定義解析器

你必須創建ValueResolver類inhering來定義你將如何從一個SuperModel映射Entity2

public class CustomResolver : ValueResolver<SuperModel, Entity2> 
{ 
    protected override Entity2 ResolveCore(SuperModel source) 
    { 
     return new Entity2 
     { 
      Children = source.Model2.Children, 
      HasPet = source.Model2.HasPet, 
      Married = source.Model2.Married, 
      NickName = source.Model1.NickName 
     }; 
    } 
} 

然後,使用這樣的:

CreateMap<SuperModel, SuperEntity>() 
    .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1)) 
    .ForMember(dest => dest.Entity2, opt => opt.ResolveUsing<CustomResolver>()); 

使用AfterMap

可以映射後執行動作,所以地圖後妙傳Model1.NicknameEntity2.Nickname值:

CreateMap<SuperModel, SuperEntity>() 
    .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1)) 
    .ForMember(dest => dest.Entity2, opt => opt.MapFrom(src => src.Model2)) 
      .AfterMap((m, e) => e.Entity2.NickName = m.Model1.NickName); 
+0

太好了,謝謝!我會在早上第一時間嘗試它(已經離開我的工作)。希望這有效:)所以我終於可以完成模塊並投票答案:) – neoselcev