如何映射属于同一类型列表的属性

时间:2018-03-25 02:20:30

标签: c# automapper

这是原始类型

public class Category
{
    public Guid Id { get; set; }
    public string CategoryName { get; set; }
    public Guid? ParentCategoryId { get; set; }
    public int? Level { get; set; }

    public Category ParentCategory { get; set; }
    public IList<Category> ChildrenCategory { get; } = new List<Category>();
    public IList<Product> Products { get; } = new List<Product>();
}

我试图映射到此类型

public class CategoryDto
{
    public Guid Id { get; set; }
    public string CategoryName { get; set; }
    public Guid? ParentCategoryId { get; set; }
    public List<CategoryDto> ChildreenCategory { get; } 
        = new List<CategoryDto>();
}

类别有一个名为 ChildrenCategory 的属性,类型为列表

我试过这个,

AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Category, CategoryDto>()
       .ForMember(d => d.ChildreenCategory,
                  o => o.MapFrom(s => s.ChildrenCategory));
                            ;
});

当我运行Postman

时,我得到一个空数组
{
    "id": "c1a16772-31d1-4025-a1b9-7206066ffd94",
    "categoryName": "Women",
    "parentCategoryId": null,
    "childreenCategory": []
},

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您的目的地DTO属性ChildreenCategory没有设置器,因此它将始终设置为空列表。添加setter可以映射您的子对象:

public List<CategoryDto> ChildreenCategory { get; set; }

如果您在DTO上拼写ChildreenCategory以匹配源类,那么您可以删除映射定义上的整个ForMember调用,因为它将自动连接。

AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Category, CategoryDto>();            
});