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