1

「ディープ ロード」されたエンティティ フレームワーク オブジェクトの自動マッピングに関して質問があります。コレクションである Tasks というメンバーを持つ Project オブジェクトがあります。そして、各タスクには、コレクションである Works というメンバーがあります。プロジェクトが深く読み込まれると、これらのタスクとその Works メンバーがすべて読み込まれます。次のようになります。

-- Project
    -- Task 1
        -- Work 1
        -- Work 2
    -- Task 2
        -- Work 3

次のようなリゾルバーを使用して 1 レベルの深さをマップする方法を見つけました。

CreateMap<DataAccess.Task, Entities.Task>()
            .ForMember(obj => obj.Description, obj => obj.MapFrom(src => src.Description))
            .ForMember(obj => obj.Estimate, obj => obj.MapFrom(src => src.Estimate))
            .ForMember(obj => obj.Id, obj => obj.MapFrom(src => src.ID))
            .ForMember(obj => obj.ProjectId, obj => obj.MapFrom(src => src.Project))
            .ForMember(obj => obj.TaskName, obj => obj.MapFrom(src => src.TaskName))
            .ForMember(obj => obj.Visible, obj => obj.MapFrom(src => src.Visible))
            .ForMember(obj => obj.WorkItems, obj => obj.ResolveUsing<WorkItemsResolver>().FromMember(src => src.Works));

public class WorkItemsResolver : ValueResolver<EntityCollection<DataAccess.Work>, ICollection<Entities.Work>>
{
    #region Overrides of ValueResolver<List<Task>,List<Task>>

    protected override ICollection<Entities.Work> ResolveCore(EntityCollection<DataAccess.Work> source)
    {
        Mapper.EntitiesMapper entitiesMapper = new EntitiesMapper(); 
        return source.Select(wk => entitiesMapper.Map<Entities.Work>(wk)).ToList();
    }

    #endregion
}

ただし、最上位のオブジェクト (プロジェクト) をマップし、その子リスト (およびその子リスト) も付随するビジネス オブジェクトにマップする方法など、2 レベル深くする方法がわかりません。

これが Automapper で可能かどうかは誰にもわかりませんか?

ありがとう

4

1 に答える 1

2

各エンティティ オブジェクトに対応する DataAccess オブジェクトが必要です。タスク マッピングは既にありますが、今度は仕事用のマッピングが必要です。また、個別の ValueResolvers を使用しないでください。ForMember のラムダ オーバーロードを使用して、必要なことは何でも行うことができます。

CreateMap<DataAccess.Task, Entities.Task>()
    // when names match on both sides, there is no need to call ForMember
    //.ForMember(obj => obj.Description, obj => obj.MapFrom(src => src.Description))
    //.ForMember(obj => obj.Estimate, obj => obj.MapFrom(src => src.Estimate))
    //.ForMember(obj => obj.Id, obj => obj.MapFrom(src => src.ID))
    .ForMember(obj => obj.ProjectId, obj => obj.MapFrom(src => src.Project))
    //.ForMember(obj => obj.TaskName, obj => obj.MapFrom(src => src.TaskName))
    //.ForMember(obj => obj.Visible, obj => obj.MapFrom(src => src.Visible))
    .ForMember(obj => obj.WorkItems, obj => obj.ResolveUsing(src =>
        Mapper.Map<IEnumerable<DataAccess.Work>>(src.Works)))
;

CreateMap<DataAccess.Work, Entities.Work>()
    // only call ForMember on properties that don't map automatically
;

オブジェクト階層の第 2 レベルの深さのマップを作成したので、ResolveUsing ラムダ オーバーロードで Mapper.Map を呼び出すだけです。

于 2012-05-15T07:35:56.973 に答える