如何解决.Net Core Automapper与多对多关系问题
我是Automapper的新手,我在映射具有多对多关系的类时遇到问题。 我想我需要嵌套映射之类的东西,但是文档对我来说似乎并不清晰。我知道我在配置AutoMapper时出了点问题,但我不知道出了什么问题。
当我将一本新书添加到数据库中时,我想接收有关该书以及编写该书的作者的信息。 (预期的JSON结果如下)
我有以下课程:
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public string ISBN { get; set; }
public string Category { get; set; }
public int PublisherId { get; set; }
public Publisher Publisher { get; set; }
public ICollection<BookAuthor> BooksAuthors { get; set; }
}
public class Author
{
public int AuthorId { get; set; }
public string AuthorName { get; set; }
public string AuthorLastName { get; set; }
public ICollection<BookAuthor> BooksAuthors { 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; }
}
DTO
public class BookForNewDto
{
public string Title { get; set; }
public string ISBN { get; set; }
public string Category { get; set; }
public int PublisherId { get; set; }
public ICollection<AuthorForNewBookDto> Authors { get; set; }
}
public class AuthorForNewBookDto
{
public int AuthorId { get; set; }
}
BookController(AddBook)
public async Task<IActionResult> AddBook([FromBody] BookForNewDto bookForNewDto)
{
var bookToCreate = _mapper.Map<Book>(bookForNewDto);
var bookToReturn = _mapper.Map<BookForNewDto>(bookToCreate);
var bookToAdd = await _context.Books.AddAsync(bookToCreate);
await _context.SaveChangesAsync();
var bookIdToAdd = bookToCreate.BookId;
var authorIdToAdd = bookForNewDto.Authors.Select(aa => aa.AuthorId).ToList();
foreach (var item in authorIdToAdd)
{
var bookAuthorToAdd = new BookAuthor()
{
BookId = bookIdToAdd,AuthorId = item
};
var newBookAuthor = await _context.BooksAuthors.AddAsync(bookAuthorToAdd);
await _context.SaveChangesAsync();
}
return Ok(bookToReturn);
}
AutoMapper Profiler // //我仅附加了与添加新书有关的部分。
public class AutoMapping : Profile
{
public AutoMapping()
{
CreateMap<BookForNewDto,Book>();
CreateMap<Book,BookForNewDto>()
.ForMember(dto => dto.PublisherId,opt => opt.MapFrom(x => x.PublisherId))
.ForMember(dto => dto.Authors,c => c.MapFrom(c => c.BooksAuthors));
CreateMap<BookForNewDto,AuthorForNewBookDto>()
.ForMember(dto => dto.AuthorId,opt => opt.MapFrom(x => x.Authors.Select(aaa => aaa.AuthorId)));
}
我的问题是如何配置AutoMapper Profiler以获取下面的JSON结果?我的作者有问题。我仍然有一个空列表。
{
"title": "sample title","isbn": "123-41-5-12311","category": "test","publisherId": 1,"authors": [
{
"authorId": 43
},{
"authorId": 45
},{
"authorId": 134
},}
解决方法
您必须记住,自动映射器依赖于属性名称来标识可以完成的“自动映射”。如果您希望Automapper自动映射它们,则它们必须相同。 对于您的情况,使用以下代码行:
var bookToCreate = _mapper.Map<Book>(bookForNewDto);
您正在尝试将 BookForNewDto 实体映射到 Book 实体。您缺少的是BookForNewDto具有一个名为 Authors 的属性,而Book具有一个名为 BooksAuthors 的属性。 Automapper永远不会知道Authors和BooksAuthors是它应该映射的内容。 因此,您需要在Automapper配置中用1行代码指定此配置:
CreateMap<BookForNewDto,Book>() (this line is already present)
.ForMember(dto=>dto.BooksAuthors,opt => opt.MapFrom(x => x.Authors));
现在,如果您调试代码,则会看到ICollection BooksAuthors已从BookForNewDto映射。
您需要添加的下一个映射也是AuthorForNewBookDto和BookAuthor,因为它们存在于您的2个实体中:请记住,如果未指定,则自动映射器会将null设置为您的值。
这是自动映射器的最终配置:
CreateMap<BookForNewDto,Book>()
.ForMember(dto=>dto.BooksAuthors,opt => opt.MapFrom(x => x.Authors));
CreateMap<Book,BookForNewDto>()
.ForMember(dto => dto.PublisherId,opt => opt.MapFrom(x => x.PublisherId))
.ForMember(dto => dto.Authors,c => c.MapFrom(c => c.BooksAuthors));
CreateMap<BookForNewDto,AuthorForNewBookDto>()
.ForMember(dto => dto.AuthorId,opt => opt.MapFrom(x => x.Authors.Select(aaa => aaa.AuthorId)));
CreateMap<AuthorForNewBookDto,BookAuthor>();
CreateMap<BookAuthor,AuthorForNewBookDto>();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。