我有两个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 -> IEnumerable
1 System.Collections.Generic.IEnumerable1[[BookService.Models.Book, BookService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.IEnumerable
1 [[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] 删除。
我来说两句