Проблема с AutoMapper и отображением IEnumerable коллекций - PullRequest
3 голосов
/ 03 сентября 2010

Вот код для картографа:

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 ]

3 голосов
/ 08 сентября 2011

У меня была точно такая же проблема. Оказывается, AutoMapper использовал свойство Id (Guid) объекта моей модели (которое обычно устанавливается частным образом nhiberate) в качестве идентификатора при кэшировании источника (независимо от того, какие другие свойства отличались). Во время тестирования я никогда не устанавливал идентификатор, поэтому guid по умолчанию был одинаковым для всех объектов, что объясняло, почему для всех был возвращен только первый элемент в IEnumerable. Поэтому я должен был сделать Id общедоступным для своих тестов, установить Id для каждого элемента, и тогда все заработало.

1 голос
/ 09 сентября 2010

Похоже, что проблема не в AutoMapper, а в том, что XPath выбрал первый узел по какой-то сумасшедшей причине.

Преобразование XmlDocument в XDocument и использование Linq-to-Xml решило мою проблему.

Спасибо за ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...