2017-01-26 5 views
1

私は、次のクラスがあります。マッピング時に親プロパティを設定しますか?

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

AutoMapperは、マップ操作の前後に実行コードをサポートします。

あなたはこの

cfg.CreateMap<Source, Target>() 
    .AfterMap((src, dest) => { .. }); 

ようなコードでそれらを定義することができますしかし、あなたはおそらくあなたのDTOは祖先の世代に依存しているこの時にのみ使用することができます - 例えばParentDtoにはChildDTOが含まれています。 これ以外の項目は互いに独立しており、AutoMapperを使用するとforeachを使用するよりも複雑になる可能性があります。

関連する問題