AutoMapper的映射问题?

内存泄漏

我有两个Model类Author和Book以及两个DTO类BookDTO和BookDetailDTO,如下所示

public class Author
{
    public int Id { get; set; }
    [Required()]
    public string Name { get; set; }
}

public class Book 
{
    public int Id { get; set; }
    [Required()]
    public string Title { get; set; }
    public int Year { get; set; }
    public decimal Price { get; set; }
    public string Genre { get; set; }
    public int AuthorId { get; set; }
    public virtual Author Author { get; set; }           
}

public class BookDTO
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string AuthorName { get; set; }
}

public class BookDetailDTO
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int Year { get; set; }
    public decimal Price { get; set; }
    public string AuthorName { get; set; }
    public string Genre { get; set; }
}

我使用AutoMapper进行映射,如下所示

public class MapConfig
{
    public static void RegisterMapping()
    {
        AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<Book, BookDTO>()
            .ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.Name)));
        AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<Book, BookDTO>()
            .ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.Name)).ReverseMap());


        //AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<Book, BookDetailDTO>()
            //.ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.Name)));
        //AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<Book, BookDetailDTO>()
            //.ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.Name)).ReverseMap());

    }
}

现在,我通过BooksController获得了书籍清单

public class BooksController : ApiController
{
    private BookServiceContext db = new BookServiceContext();


    public IQueryable<BookDTO> GetBooks()
    {

        var books = AutoMapper.Mapper.Map<IEnumerable<Book>, IEnumerable<BookDTO>>(db.Books);
        return books.AsQueryable();
    }
}

它列出了书籍清单。

但是,当我取消注释MapConfig.cs中BookDetailDTO的映射并且尝试获取“图书”列表时,它将引发以下错误

映射类型:IEnumerable 1 -> IEnumerable1 System.Collections.Generic.IEnumerable 1[[BookService.Models.Book, BookService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.IEnumerable1 [[BookService.Models.BookDTO,BookService,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]

我需要从Book到BookDetailDTO的映射以显示该书的详细信息。我究竟做错了什么?我使用AutoMapper 5.1.1

内存泄漏

这解决了我的问题,我认为我们必须将所有映射放入initialize方法中

      AutoMapper.Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Book, BookDTO>()
                .ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.Name));
            cfg.CreateMap<Book, BookDetailDTO>()
             .ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.Name));
        });

即使这解决了我的问题,但我不确定这是否是解决问题的最佳方法。如果有人对如何映射项目中的所有映射有更好的答案,请共享相同的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章