如何使用automapper将源类型的Parent映射到目标类型的集合?

时间:2013-11-15 11:37:34

标签: c# automapper

我有这些课程:

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关系。 DestinationUserDestination级的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对象。

1 个答案:

答案 0 :(得分:4)

原来我距离我所追求的解决方案只有一步之遥。我只需要将SourceUserDestinationUser类的映射扩展为如下所示:

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

希望这可以帮助遇到与我面临的问题相似的人:)