簡體   English   中英

從DTO自動映射(使用AutoMapper)到其中具有多對多關系的實體

[英]Auto mapping (with AutoMapper) from DTO to an entity with many-to-many relationship in it

我遇到了以下示例中反映的問題。 我已經在BookController中創建了一個POST方法來創建Book實體:

這是我的代碼:

public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public virtual ICollection<BookCategory> BookCategories { get; set; }
}

public class BookCategory
{
    public int BookId { get; set; }
    public virtual Book Book { get; set; }
    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }
}

我的DTO:

public class BookDto
{
    public int BookId { get; set; }
    public string Title { get; set; }

    public ICollection<CategoryDto> Categories { get; set; }
}

public class CategoryDto
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
}

自動映射器配置:

        CreateMap<Book, BookDto>().ReverseMap();
        CreateMap<BookCategory, CategoryDto>()
            .ForMember(d => d.CategoryId, opt => opt.MapFrom(s => s.CategoryId))
            .ForMember(d => d.CategoryName, opt => opt.MapFrom(s => s.Category.CategoryName));
        CreateMap<CategoryDto, BookCategory>().ForMember(d => d.CategoryId, opt => opt.MapFrom(s => s.CategoryId));

        CreateMap<BookDto, Book>().AfterMap((s, d) =>
        {
            foreach (var bookCategory in d.BookCategories)
            {
                bookCategory.BookId = s.BookId;
            }
        });

這是我要映射到實體的DTO:

        BookDto model = new BookDto()
        {
            Title = "Test book",
            Categories = new List<CategoryDto>()
            {
                new CategoryDto()
                {
                    CategoryId = 1,
                    CategoryName = "drama"
                }
            },
        };

BookDto是一本新書,但是它指向現有的類別。 在數據庫中已經存在Category.Id = 1,其中“ drama”作為CategoryName。 當前問題在於映射:

    CreateMap<BookDto, Book>().AfterMap((s, d) =>
    {
        foreach (var bookCategory in d.BookCategories)
        {
            bookCategory.BookId = s.BookId;
        }
    });

在此處輸入圖片說明

當上面的代碼即將執行時,d.BookCategories為null。 所以我想知道我的映射有什么問題嗎?

AutoMapper自動映射具有相同名稱的成員。 由於BookBookDto集合具有不同的名稱( BookCategoriesCategories ),因此必須對其進行顯式映射。 您可以在其中一張地圖中執行此操作,而ReverseMap將處理相反的情況:

CreateMap<Book, BookDto>()
    .ForMember(d => d.Categories, opt => opt.MapFrom(s => s.BookCategories))
    .ReverseMap()
    .AfterMap((s, d) =>
    {
        foreach (var bookCategory in d.BookCategories)
            bookCategory.BookId = s.BookId;
    });

但是由於BookCategory實體僅包含2個id,因此可以避免從CategoryDtoBookCategoryAfterMap的映射,並使用簡單的LINQ投影(`Select')進行反向映射:

CreateMap<Book, BookDto>()
    .ForMember(d => d.Categories, opt => opt.MapFrom(s => s.BookCategories))
    .ReverseMap()
    .ForMember(d => d.BookCategories, opt => opt.MapFrom(s => s.Categories
        .Select(c => new BookCategory { BookId = s.BookId, CategoryId = c.CategoryId })));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM