如何使用 AutoMapper 映射相关数据

Sti*_*ian 3 automapper entity-framework-core

我正在尝试使用 AutoMapper 将三个实体模型映射到一个视图模型中。最终输出应该是一个递归类别树,类别中包含产品。类别树正在工作,但Products视图模型的-property 是null. 我的查询返回类别和产品,所以我认为映射不知道如何将产品映射到视图模型。

我的实体模型:

public class ProductCategory
{
    public int Id { get; set; }
    public int SortOrder { get; set; }
    public string Title { get; set; }
    [ForeignKey(nameof(ParentCategory))]
    public int? ParentId { get; set; }
    // Nav.props:
    public ProductCategory ParentCategory { get; set; }
    public ICollection<ProductCategory> Children { get; set; }
    public List<ProductInCategory> ProductInCategory { get; set; }
}

public class ProductInCategory
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public int SortOrder { get; set; }
    public int ProductCategoryId { get; set; }
    public bool IsProductCategoryFrontPage { get; set; }
    // Nav.props.
    public Product Product { get; set; }
    public ProductCategory ProductCategory { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Info { get; set; }
    public decimal Price { get; set; }
    // Nav.prop:
    public List<ProductInCategory> InCategories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的视图模型:

public class ViewModelProductCategory
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Title { get; set; }
    public int SortOrder { get; set; }

    public string ProductCountInfo
    {
        get
        {
            return Products != null && Products.Any() ? Products.Count().ToString() : "0";
        }
    }

    public ViewModelProductCategory ParentCategory { get; set; }
    public IEnumerable<ViewModelProductCategory> Children { get; set; }
    public IEnumerable<ViewModelProduct> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我试过这个映射(地图类别,但没有产品):

CreateMap<ProductCategory, ViewModelProductCategory>();
CreateMap<ViewModelProductCategory, ProductCategory>();
Run Code Online (Sandbox Code Playgroud)

我试过这个映射(地图类别,但没有产品):

CreateMap<ProductCategory, ViewModelProductCategory>()
    .ForMember(dto => dto.Id, opt => opt.MapFrom(src => src.Id))
    .ForMember(dto => dto.ParentId, opt => opt.MapFrom(src => src.ParentId))
    .ForMember(dto => dto.Title, opt => opt.MapFrom(src => src.Title))
    .ForMember(dto => dto.SortOrder, opt => opt.MapFrom(src => src.SortOrder))
    .ForMember(dto => dto.Children, opt => opt.MapFrom(src => src.Children))
    .ForMember(dto => dto.Products, opt => opt.MapFrom(src => src.ProductInCategory));
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

看起来您想跳过视图模型中的连接(链接)实体。

为此,首先创建从Product到的映射ViewModelProduct,然后使用投影转换为定义从ProductCategory.ProductInCategory到的映射。AutoMapper 将注意转换为与查询相同的方式:ViewModelProductCategory.ProductsList<ProductInCategory>IEnumerable<Product>IEnumerable<Product>List<ViewModelProduct>Products

CreateMap<Product, ViewModelProduct>();

CreateMap<ProductCategory, ViewModelProductCategory>()
    .ForMember(dst => dst.Products, opt => opt.MapFrom(
        src => src.ProductInCategory.Select(pc => pc.Product)));
Run Code Online (Sandbox Code Playgroud)