gpt4 book ai didi

c# - 实体核心映射实体类型与连接表

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:47 24 4
gpt4 key购买 nike

我已经开始使用实体核心,但遇到了一个问题。我在我的项目中使用 automapper,但不知道如何填充我的连接表 (BookAuthor)。

在 MVC 中,我使用 ICollections,但实体核心尚不支持使用多对多关系实体,现在我必须使用连接表。

问题:如何将我的 Bookview 模型映射到 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 })));

最佳答案

这是所需的映射配置:

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 返回的表达式的type 来匹配目的地的类型。如果不匹配,则 AutoMapper 将尝试使用相应的映射(如果有)将返回的类型映射到目标类型。这允许您重用映射。

为了将 BookAuthor 转换为 AuthorViewModel,首先将其转换为 Author(通过简单地提取 Author 属性)就像它是 Author 的集合一样,让 AM 使用相应的映射将 Author 转换为 AuthorViewModel

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

关于c# - 实体核心映射实体类型与连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49463501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com