我已经开始使用实体核心而且遇到了一个问题。 我在我的项目中使用了者,并且不知道如何填充我的连接表(BookAuthor)。
在MVC中,我使用ICollections,但实体核心尚不支持使用多对多关系实体,现在我必须使用连接表。
问题:如何将Bookview模型映射到本书? 我不知道我应该如何处理BookAuthors列表。也许我不应该填充它?
我尝试了类似的东西,但它没有用。
CreateMap<BookViewModel, Book>()
.ForMember(b => b.BookAuthors, opt => opt.MapFrom(b => b.Authors.Select(a => new BookAuthor
{
AuthorId = a.AuthorId
}
模型(为简洁起见,删除了一些属性)
public class Book
{
public int BookId { get; set; }
public List<BookAuthor> BookAuthors { get; set; }
}
public class Author
{
public int AuthorId { get; set; }
public string AuthorName { get; set; }
public List<BookAuthor> BookAuthors { 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; }
}
public class BookViewModel
{
public int BookId { get; set; }
public virtual List<AuthorViewModel> Authors { get; set; }
}
public class AuthorViewModel
{
public int AuthorId { get; set; }
public string AuthorName { get; set; }
}
public class Library : DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Author> Authors { get; set; }
}
映射的工作版本
.ForMember(dto => dto.Authors, opt => opt.MapFrom(b => b.BookAuthors.Select(a=>a.Author).ToList()));
CreateMap<List<BookAuthor>, List<AuthorViewModel>>();
.PreserveReferences()//don't forget about this row or you will get an error
.ForMember(b => b.BookAuthors, opt => opt.MapFrom(b => b.Authors
.Select(a => new { b.BookId, Book = b, a.AuthorId, Author = a })));
答案 0 :(得分:2)
以下是所需的映射配置:
CreateMap<Book, BookViewModel>()
// Book -> BookViewModel
.ForMember(b => b.Authors, opt => opt.MapFrom(b => b.BookAuthors
.Select(ba => ba.Author)))
.ReverseMap()
// BookViewModel -> Book
.PreserveReferences()
.ForMember(b => b.BookAuthors, opt => opt.MapFrom(b => b.Authors
.Select(a => new { b.BookId, Book = b, a.AuthorId, Author = a })))
;
CreateMap<Author, AuthorViewModel>()
// Author -> AuthorViewModel
.ReverseMap()
// AuthorViewModel -> Author
;
最重要的是要意识到AutoMapper不需要MapFrom
返回表达式的类型来匹配目标的类型。如果它不匹配,则AutoMapper将尝试使用相应的映射(如果有)将返回的类型映射到目标类型。这允许您重用映射。
为了将BookAuthor
转换为AuthorViewModel
,您首先将其转换为Author
(通过简单地提取Author
属性),就好像它是{Author
的集合一样。 1}},让AM使用相应的映射将Author
转换为AuthorViewModel
。
为了将AuthorViewModel
从BookViewModel.Authors
转换为BookAuthor
,您首先将其转换为与BookAuthor
类似的非同类型类型,但具有相应的Book
和{ {1}}属性类型为Author
类型,并让AM使用相应的映射将其转换为ViewModel
。 BookAuthor
用于避免由于循环引用模型而导致的堆栈溢出。