Automapper(c#):嵌套映射不起作用,任何人都可以帮忙吗?

时间:2011-03-24 15:06:51

标签: c# automapper nested-class

我有一个简单的映射,它正在工作,但它没有填写Output.Details。

我有点困惑,我想也许是因为我使用的来源是每个人的“任务”。

  Mapper.CreateMap<Task, Output>();


  Mapper.CreateMap<Task, Output.Details>().ForMember(
       dest => dest.Item, opt => opt.MapFrom(src => src.Name));

据我所知,我必须创建2个地图,1个用于对象,1个用于包含在其中的对象。

问题是OUTPUT的来源和OUTPUT.DETAILS可以在任务中找到

我尝试在第一张地图中钻研详情并指定Mapfrom,但它会出现以下错误,这就是为什么我必须创建2张地图

         must resolve to top-level member. Parameter name: lambdaExpression error

  IList<Task> tempItems= GetItems();

        IList<Output> items =
            Mapper.Map<IList<Task>, IList<Output>>(tempItems);

地图有效,但我在Output.Details中的属性“Item”是空的

我做错了什么..这是我的目标对象。任何帮助真的很感激

它填写Name没有问题,但在DETAILS中没有任何内容......它们都是NULL

任务不是我的班级,但我检查了它,所有值都被复制,因此Tag有一个值并且是一个STRING。

public class Output   
{
    public string Name { get; set; }

    public Details Summary { get; private set; }

    public class Details
    {
        public string Item{ get; set; }
    }

    public Output()
    {
        Summary = new Details();
    }
}

修改

以下是Task类的示例。

enter image description here

修改

这是一个示例vs 2010项目,它显示了问题。

http://dl.dropbox.com/u/20103903/AutomapperNotWorking.zip

这是一个显示问题的图片,因为你可以看到摘要项目是“NULL”但它应该包含来自任务的NAME。

enter image description here

2 个答案:

答案 0 :(得分:4)

首先,请始终使用Mapper.AssertConfigurationIsValid();以确保您的映射配置有效。我将它添加到您的代码中,它立即突出显示了问题:您没有告诉Automapper如何处理Summary属性。由于Task不包含名为Summary的属性,因此Automapper需要知道如何处理它。

所以问题不在于如何映射嵌套类,您只需要告诉Automapper如何处理Summary。以下是适用于您的示例的Automapper配置:

Mapper.CreateMap<Task, Output>()
    .ForMember(d => d.Summary, o => o.MapFrom(t => new Output.Details {Item = t.Name}));
Mapper.AssertConfigurationIsValid();

这就是你所需要的一切。

答案 1 :(得分:0)

对于新版本,可以执行以下操作:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<UdtDevQuestion, QuestionViewModel>();
});
config.AssertConfigurationIsValid();