2010-09-03 83 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