2013-11-15 79 views
1

我有這些類:如何使用自動映射器將源類型的父映射到目標類型的集合?

public class Source 
{ 
    public string ID { get; set; } 
    public int Age Name { get; set; } 
    public virtual ICollection<SourceChild> SourceChildren { get; set; } 
} 

public class SourceChild 
{ 
    public string Name { get; set; } 
    public string Language { get; set; } 
    public string SourceId { get; set; } 
    public virtual Source Source { get; set; } 
} 

public class Destination 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
    public string Language { get; set; } 
    public string Id { get; set; } 
} 

我用這些映射映射這些類:

 Mapper.CreateMap<SourceChild, Destination>() 
      .ForMember(item => item.ID, property => property.MapFrom(item => item.SourceId)) 
      .ForMember(item => item.Age, property => property.MapFrom(item => item.Source.Age)); 

Automapper其他兩個屬性自動映射。所以一切工作正常,如果我試圖將SourceChild映射到Destination類型。但是現在我有使用源和目的地類型的其他類:

public class SourceUser 
{ 
    public string ID { get; set; } 
    public virtual Source Source { get; set; } 
} 

public class DestinationUser 
{ 
    public string Id { get; set; } 
    public List<Destination> Destinations { get; set; } 
} 

爲了說明情況較好這裏是上了班簡短描述:我有Source對象和SourceChild子對象。對象包含不同語言的信息。當我將Source映射到Destination時,我想輸入Source對象並接收一組目標對象的輸出。對於每個SourceChild對象,有Source對象,應該有一個Destination對象。 SourceUser只是指具有1-many關係的SourceDestinationUserDestination類有很多很多。換句話說,每個DestinationUser都有一個所有語言的所有Destinations的列表。考慮到這一切,讓我們回到代碼。

我在編寫我需要的代碼方面有一些運氣。我已經拿出了這個:

Mapper.CreateMap<SourceUser, DestinationUser>() 
       .AfterMap((source, destination) => Mapper.Map<Source, List<Destination>>(source.Source)); 

    Mapper.CreateMap<Source, List<Destination>>() 
        .AfterMap((source, destination) => Mapper.Map<List<SourceChild>, List<Destination>>(source.SourceChildren.ToList(), destination)); 

這個工程幾乎足夠,有一個如果雖然。我正在使用可查詢的擴展來處理映射。當我檢索DestinationUsers的集合時,它們都沒有映射的屬性Destinations。它顯示爲空。但是,如果我這樣做手動映射:

SourceUser SourceUser = Db.GetSourceUser(); 
DestinationUser DestUser = Db.GetDestinationUser(); 
DestUser.Destinations = Mapper.Map<List<Destination>>(SourceUser.Source); 

everythign正常工作。 DestinationUsers的列表是從Source的實例映射而來的。

是否可以避免手動呼叫後者Mapper.Map()呼叫?另外請記住,列表目的地可能會更改爲任何其他收藏品。我只想爲每個SourceChild對象Source擁有一個目標對象。

回答

3

原來我離我的解決方案只有一步之遙。所有我需要的是延長我的SourceUserDestinationUser類映射到這個樣子:

Mapper.CreateMap<SourceUser, DestinationUser>() 
       .AfterMap((source, destination) => Mapper.Map<Source, List<Destination>>(source.Source, destination.Destinations)); 

希望這可以幫助別人,遇到類似的問題,我面臨:)

的一個
相關問題