繁体   English   中英

实体核心使用连接表映射实体类型

[英]Entity core Mapping entity types with join table

我已经开始使用实体核心,我遇到了一个问题。 我在我的项目中使用了automapper,并且不知道如何填充我的连接表(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 })));

这是所需的映射配置:

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的集合一样,并让AM使用相应的映射将Author转换为AuthorViewModel

为了将AuthorViewModelBookViewModel.Authors转换为BookAuthor ,首先将其转换为类似于BookAuthor anonomymous类型,但相应的BookAuthor属性类型为ViewModel类型,并让AM使用相应的映射将其转换为BookAuthor PreserveReferences()用于避免由于循环引用模型而导致的堆栈溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM