2010-09-03 86 views
3

下面是映射代码:问题与AutoMapper和映射的IEnumerable集合

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,该方案工作得很好,但Enumeration似乎是一个问题。例如,下面的代码工作得很好:

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

有什么想法?谢谢!

+0

东西有点相似,并与另一种映射技术,它可以帮助我认为:http://valueinjecter.codeplex.com/Thread/View.aspx?ThreadId=218448 – Omu 2010-09-06 17:56:06

+0

谢谢 - 我试过类似的方法,但一直无法到达任何地方。我会发布一个响应,以显示我已经去... – 2010-09-07 16:40:36

回答

1

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

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

感谢您的意见。

3

我有完全相同的问题。当缓存源代码时(不管其他属性有什么不同),AutoMapper使用我的模型对象的Id(Guid)属性(通常由nhiberate私下设置)作为标识符。在测试期间,我从来没有设置id,所以所有对象的默认guid都是相同的,这就解释了为什么只有IEnumerable中的第一项被返回。所以我不得不让我的测试公开,为每个项目设置Id,然后一切正常。

+0

我也看到了这一点。看来,automapper寻找某种类型的ID字段。我也没有在我的测试中设置这个ID,因为它不相关,但它导致automapper认为集合中的所有项目都是相同的。 – SouthShoreAK 2015-11-03 17:16:56