我有這些類:如何使用自動映射器將源類型的父映射到目標類型的集合?
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關係的Source
。 DestinationUser
與Destination
類有很多很多。換句話說,每個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
擁有一個目標對象。