C# 实体核心映射实体类型与联接表

C# 实体核心映射实体类型与联接表,c#,entity-framework,asp.net-core,automapper,entity-framework-core,C#,Entity Framework,Asp.net Core,Automapper,Entity Framework Core,我开始使用entity core,但遇到了一个问题。 我在项目中使用automapper,不知道如何填充我的联接表(BookAuthor) 在MVC中,我使用ICollections,但EntityCore还不支持使用多对多关系实体,现在我必须使用联接表 问题:如何将我的Bookviewmodel映射到该书? 我不知道该怎么处理我的作者名单。也许我不应该在这里居住 我试过类似的方法,但不起作用 CreateMap<BookViewModel, Book>() .ForMember(b

我开始使用entity core,但遇到了一个问题。 我在项目中使用automapper,不知道如何填充我的联接表(BookAuthor)

在MVC中,我使用ICollections,但EntityCore还不支持使用多对多关系实体,现在我必须使用联接表

问题:如何将我的Bookviewmodel映射到该书? 我不知道该怎么处理我的作者名单。也许我不应该在这里居住

我试过类似的方法,但不起作用

CreateMap<BookViewModel, Book>()
.ForMember(b => b.BookAuthors, opt => opt.MapFrom(b => b.Authors.Select(a => new BookAuthor
            {
                AuthorId = a.AuthorId
            }
CreateMap()
.ForMember(b=>b.BookAuthors,opt=>opt.MapFrom(b=>b.Authors.Select)(a=>newbookauthor
{
AuthorId=a.AuthorId
}
模型(为了简洁起见删除了一些属性)

公共课堂教材
{
public int BookId{get;set;}
公共列表图书作者{get;set;}
}
公共类作者
{
公共int AuthorId{get;set;}
公共字符串AuthorName{get;set;}
公共列表图书作者{get;set;}
}
公共类图书作者
{
public int BookId{get;set;}
公共图书{get;set;}
公共int AuthorId{get;set;}
公共作者{get;set;}
}
公共类bookview模型
{
public int BookId{get;set;}
公共虚拟列表作者{get;set;}
}
公共类AuthorViewModel
{
公共int AuthorId{get;set;}
公共字符串AuthorName{get;set;}
}
公共类库:DbContext
{
公共数据库集书籍{get;set;}
公共数据库集作者{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 })));
.ForMember(dto=>dto.Authors,opt=>opt.MapFrom(b=>b.BookAuthors.Select(a=>a.Author.ToList());
CreateMap();
.PreserveReferences()//不要忘记此行,否则会出错
.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
    ;
CreateMap()
//图书->图书视图模型
.ForMember(b=>b.Authors,opt=>opt.MapFrom(b=>b.BookAuthors
.Select(ba=>ba.Author)))
.ReverseMap()
//BookViewModel->Book
.参考资料()
.ForMember(b=>b.BookAuthors,opt=>opt.MapFrom(b=>b.Authors
.Select(a=>new{b.BookId,Book=b,a.AuthorId,Author=a})
;
CreateMap()
//作者->作者视图模型
.ReverseMap()
//AuthorViewModel->Author
;
最重要的是要认识到,AutoMapper不需要从
MapFrom
返回的表达式的类型来匹配目标类型。如果不匹配,则AutoMapper将尝试使用相应的映射(如果有)将返回的类型映射到目标类型。这允许您重新定义映射

为了将
BookAuthor
转换为
AuthorViewModel
,首先将其转换为
Author
(只需提取
Author
属性),就像它是
Author
的集合一样,然后让我使用相应的映射将
AuthorViewModel
转换为
AuthorViewModel


为了将
AuthorViewModel
BookViewModel.Authors
转换为
BookAuthor
,首先将其转换为类似于
BookAuthor
的匿名类型,但相应的
Book
Author
属性类型为
ViewModel
类型,并让我将其转换为
BookAuthor
使用相应的映射。
preserverences()
用于避免由于循环引用模型而导致堆栈溢出。

以下是所需的映射配置:

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
    ;
CreateMap()
//图书->图书视图模型
.ForMember(b=>b.Authors,opt=>opt.MapFrom(b=>b.BookAuthors
.Select(ba=>ba.Author)))
.ReverseMap()
//BookViewModel->Book
.参考资料()
.ForMember(b=>b.BookAuthors,opt=>opt.MapFrom(b=>b.Authors
.Select(a=>new{b.BookId,Book=b,a.AuthorId,Author=a})
;
CreateMap()
//作者->作者视图模型
.ReverseMap()
//AuthorViewModel->Author
;
最重要的是要认识到,AutoMapper不需要从
MapFrom
返回的表达式的类型来匹配目标类型。如果不匹配,则AutoMapper将尝试使用相应的映射(如果有)将返回的类型映射到目标类型。这允许您重新定义映射

为了将
BookAuthor
转换为
AuthorViewModel
,首先将其转换为
Author
(只需提取
Author
属性),就像它是
Author
的集合一样,然后让我使用相应的映射将
AuthorViewModel
转换为
AuthorViewModel


为了将
AuthorViewModel
BookViewModel.Authors
转换为
BookAuthor
,首先将其转换为类似于
BookAuthor
的匿名类型,但相应的
Book
Author
属性类型为
ViewModel
类型,并让我将其转换为
BookAuthor
使用相应的映射。
preserverences()
用于避免由于循环引用模型而导致堆栈溢出。

不应设置
BookId=b.BookId
而应设置
AuthorId=a.AuthorId
。但是,请注意,这仅在添加新书时足够。通常不建议使用AutoMapper将视图模型映射到实体,因为通常需要业务逻辑,您不应该试图将其塞进映射配置中。我的导师说我不应该使用DTO…添加书籍正是我需要的。Oka