我有这些课程:
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
个子对象。 SourceChild
个对象包含不同语言的信息。当我将Source映射到Destination
时,我想输入Source对象并接收目标对象集合的输出。对于每个SourceChild
对象,Source
对象,应该有一个Destination
对象。SourceUser
只是引用Source
,具有1-many关系。 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
这很好用,但有一个IF。我正在使用可查询扩展来处理映射。当我检索Destinations
的集合时,它们都没有映射到属性SourceUser SourceUser = Db.GetSourceUser();
DestinationUser DestUser = Db.GetDestinationUser();
DestUser.Destinations = Mapper.Map<List<Destination>>(SourceUser.Source);
。它显示为null。但是,如果我像这样手动进行映射:
Mapper.Map()
everythign工作正常。 DestinationUsers列表从Source实例映射。
是否可以避免手动调用后者SourceChild
来电?还要记住,列表目的地可以更改为任何其他集合。我只想为每个Source
对象{{1}}创建一个Destination对象。
答案 0 :(得分:4)
原来我距离我所追求的解决方案只有一步之遥。我只需要将SourceUser
和DestinationUser
类的映射扩展为如下所示:
Mapper.CreateMap<SourceUser, DestinationUser>()
.AfterMap((source, destination) => Mapper.Map<Source, List<Destination>>(source.Source, destination.Destinations));
希望这可以帮助遇到与我面临的问题相似的人:)