automapper多对多关系映射

时间:2018-05-16 22:56:49

标签: c# automapper

让我们说,在BookDetails页面(BookForDetailsDto)中,我们还展示了该书的作者(AuthorForListingDto)。而且,我想在每个作者的书籍(BookForAuthorListingDto)上显示这个作者列表以及一些信息(只是名称和ID)。

我有一个简单的多对多关系,包括Book,Author和BookAuthor对象。

public class Book {        
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BookAuthor> Authors { get; set; }
}

public class Author {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BookAuthor> Books { get; set; }
}

public class BookAuthor {
    public int BookId { get; set; }
    public Book Book { get; set; }
    public int AuthorId { get; set; }
    public Author Author { get; set; }
}

我还有3个DTO(我停止无限循环):

public class BookForDetailsDto {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<AuthorForListingDto> Authors { get; set; }
}

public class AuthorForListingDto {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BookForAuthorListingDto> Books { get; set; }
}

public class BookForAuthorListingDto {
    public int Id { get; set; }
    public string Name { get; set; }
}

具有以下配置:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Book, BookForDetailsDto>();
    cfg.CreateMap<BookAuthor, AuthorForListingDto>();
    cfg.CreateMap<AuthorForListingDto, BookForAuthorListingDto>();
});

我想执行从Book到BookForDetailsD的映射,就像这样。

BookForDetailsDto BookDto = mapper.Map<BookForDetailsDto>(book);

但结果是,我得到了System.NullReferenceException。 看来,只是在第一级映射中,AutoMapper无法从BookAuthor对象中获取Author信息。 我正在寻找配置选项,但没有运气。我应该说我是使用automapper的新手,如果有一个简单的解决方案,我很感激。

注意:我看到的评论类似于&#34;在一个DTO中引用第二个DTO&#34;是不太好的做法。但我无法弄清楚如何做,否则,例如,对于可点击/可导航的child_object,我们至少需要&#34;一个键和一个display_name&#34;,所以List类型的子对象似乎是不可避免的。

1 个答案:

答案 0 :(得分:0)

带着新头脑的新一天...... 我改变了如下的映射,它按预期工作:

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Book, BookForDetailsDto>()
                .ForMember(dto => dto.Authorss, opt => opt.MapFrom(x => x.Authors.Select(a => a.Author)));
            cfg.CreateMap<BookAuthor, BookForAuthorListingDto >()
                .ForMember(res => res.Id, opt => opt.MapFrom(dto => dto.Book.Id))
                .ForMember(res => res.Name, opt => opt.MapFrom(dto => dto.Book.Name));
        });