AutoMapper的问题和映射IEnumerable集合

时间:2010-09-03 19:24:30

标签: c# .net automapper

以下是mapper的代码:

public IEnumerable<GetQuestionsContract> Map(IEnumerable<XmlNode> nodes, XmlNamespaceManager namespaceManager)
    {
        Mapper.CreateMap<XmlNode, GetQuestionsContract>()
            .ForMember(
                dest => dest.Id, 
                options =>
                options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
                    source => source.SelectSingleNode("//wfauth60xsd:questionID", namespaceManager)))
            .ForMember(
                dest => dest.Question, 
                options =>
                options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
                    source => source.SelectSingleNode("//wfauth60xsd:question", namespaceManager)));

        return Mapper.Map<IEnumerable<XmlNode>, List<GetQuestionsContract>>(nodes);
    }

虽然这有效,但它似乎只能多次返回IEnumerable列表中的第一个元素(与XmlNodeList中的项目一样多次)。

更新:我简化了代码并更新了标题。如果我映射到一个XmlNode,该方案可以正常工作,但枚举似乎是个问题。例如,以下代码可以正常工作:

public SomeIdContract Map(XmlDocument document, XmlNamespaceManager namespaceManager)
    {
        Mapper.CreateMap<XmlDocument, SomeIdContract>()
            .ForMember(
                dest => dest.Id, 
                options =>
                options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
                    source => source.SelectSingleNode("//wfauth60msgs:someID", namespaceManager)));

        return Mapper.Map<XmlDocument, SomeIdContract>(document);
    }

有什么想法?谢谢!

2 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题。结果发现AutoMapper在缓存源时使用我的模型对象的Id(Guid)属性(通常由nhiberate私有设置)作为标识符(无论其他属性有何不同)。在测试期间,我从不设置id,因此所有对象的默认guid都是相同的,这解释了为什么只返回IEnumerable中的第一个项目。因此,我必须将Id公开给我的测试,为每个项目设置Id,然后一切正常。

答案 1 :(得分:1)

似乎问题不在于AutoMapper,而是由于某些疯狂的原因XPath选择了第一个节点。

将XmlDocument转换为XDocument并使用Linq-to-Xml解决了我的问题。

感谢您的投入。