c# - automapper 多对多关系映射

标签 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 对象获取作者信息。 我正在寻找配置选项,但没有运气。我应该说我是自动映射器的新手,如果有一个简单的解决方案我很感激。

注意:我看到一条评论,内容类似于“在一个 DTO 中引用第二个 DTO 不是一个好习惯”。但我不知道该怎么做,因为,例如,对于可点击/可导航的 child_object,我们至少需要“一个键和一个 display_name”,因此 List 类型的子对象似乎是不可避免的。

最佳答案

新的一天,新的头脑…… 我更改了如下映射,它按预期工作:

        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));
        });

关于c# - automapper 多对多关系映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381065/

相关文章:

c# - DateTime.ParseExact 方法 : always throws exception even with correct format 的问题

c# - 两个 LINQ 语句对应一个可等待的 LINQ 数据库查询(优化)

C# Silverlight 获取声音的频率

c# - AutoMapper项目To : Not working with nested objects

unity-container - 使用 Unity 注册 Automapper

c# - 检测从数组中单击了哪个按钮

c# - Dapper.net "where ... in"查询不适用于 PostgreSQL

c# - AutoMapper 配置为所有 DateTime 属性使用本地时间

c# - Clean Architecture 外部 REST API 作为适配器

c# - 有谁知道 EF6 和 AutoMapper 进行枚举转换时发生了什么