【问题标题】:Issue with AutoMapper and mapping IEnumerable collectionsAutoMapper 和映射 IEnumerable 集合的问题
【发布时间】:2011-09-08 11:30:24
【问题描述】:

这是映射器的代码:

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);
    }

有什么想法吗?谢谢!

【问题讨论】:

标签: c# .net automapper


【解决方案1】:

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

【讨论】:

  • 我也看到了这个。 automapper 似乎在寻找某种 ID 字段。我也没有在测试中设置此 ID,因为它不相关,但它导致自动映射器认为集合中的所有项目都是相同的。
【解决方案2】:

看来问题不在于 AutoMapper,而在于 XPath 出于某种疯狂的原因选择了第一个节点。

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

感谢您的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多