映射时设置父属性?

时间:2017-01-26 15:39:34

标签: c# automapper

我有以下课程:

public class ParentDto
{
    public Guid Guid {get; set;}
    public IEnumerable<Child> Children {get; set;}

    public ParentDto() { Guid = Guid.NewGuid(); }
}

public class ChildDto
{
    public Guid Guid {get; set;}
    public Guid ParentGuid {get; set;}
    public IEnumerable<GrandChild> GrandChildren {get; set;}

    public ChildDto() { Guid = Guid.NewGuid(); }
}

public class GrandChildDto
{
    public Guid Guid {get; set;}
    public Guid ChildGuid {get; set;}

    public GrandChildDto() { Guid = Guid.NewGuid(); }
}

映射只是:

Mapper.Initialize(cfg =>
{
  cfg.CreateMap<ParentModel, ParentDto>().ReverseMap();
  cfg.CreateMap<ChildModel, ChildDto>().ReverseMap();
  cfg.CreateMap<GrandChildModel, GrandChildDto>().ReverseMap();
});

目前,我首先进行映射,然后执行:

foreach (var child in parent.Children)
{
    child.ParentGuid = parent.Guid;

    foreach (var grandChild in child.GrandChildren)
    {
        grandChild.ChildGuid = child.Guid;
    }
}

这是因为Guid属性只能在DTO类中找到。

是否可以在映射配置中设置guid并避免foreach阻止?

1 个答案:

答案 0 :(得分:1)

AutoMapper支持在地图操作之前和之后执行代码。

您可以使用此代码

来定义它们
cfg.CreateMap<Source, Target>()
   .AfterMap((src, dest) => { .. }); 

但是,只有当您的DTO取决于祖先一代时,您才可以使用它 - 例如ParentDto包含ChildDTO。 这些项目彼此独立,使用AutoMapper可能比使用foreach更复杂。