【发布时间】:2018-04-16 14:54:50
【问题描述】:
我已经开始使用实体核心,但遇到了一个问题。 我在我的项目中使用自动映射器,但不知道如何填充我的连接表(BookAuthor)。
在 MVC 中,我使用 ICollections,但实体核心还不支持使用多对多关系实体,现在我必须使用连接表。
问题:如何将我的 Bookviewmodel 映射到 Book? 我不知道应该如何处理我的 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 })));
【问题讨论】:
-
您应该设置
AuthorId = a.AuthorId,而不是设置BookId = b.BookId。但是请注意,这仅在您添加新书时就足够了。通常不建议使用 AutoMapper 将视图模型映射到实体,因为这通常需要您不应该尝试将业务逻辑塞进映射配置中。 -
我的导师说我不应该使用DTO的......添加书籍正是我所需要的。好的,我将设置 AuthorId,但我将如何处理另外 3 个属性?它们现在为空...
-
我从来没有使用过连接表,对于愚蠢的问题非常抱歉。
-
只需保存更改。 EF 将负责设置其他外键。当您从数据库中重读书籍时,包括
BookAuthors和Book,EF 将填充所有属性。 -
非常感谢。我会试试的。
标签: c# entity-framework asp.net-core automapper entity-framework-core