Automapper не игнорирует вложенное свойство 2-го уровня при запросе - PullRequest
1 голос
/ 07 декабря 2011

Возникли проблемы с опцией Automapper 'Ignore'. Вот тест с описанием проблемы, с которой я столкнулся:

    using AutoMapper;
    using NUnit.Framework;

    [TestFixture]
    public class Sample
    {
        public class OuterSource
        {
            public InnerSource Inner { get; set; }
        }

        public class InnerSource
        {
            public InnerInnerSource InnerInner { get; set; }
        }

        public class InnerInnerSource
        {
            public int Value { get; set; }
        }

        public class OuterDest
        {
            public InnerDest Inner { get; set; }
        }

        public class InnerDest
        {
            public InnerInnerDest InnerInner { get; set; }
        }

        public class InnerInnerDest
        {
            public int Value { get; set; }
        }

        [Test]
        public void MergeMap_WhenIgnoringLevel2InnerProperty_PropertyRemainsUnchanged()
        {
            Mapper.CreateMap<OuterSource, OuterDest>();
                //.ForMember(d => d.Inner, opts => opts.Ignore());  // test passes when added back in
            Mapper.CreateMap<InnerSource, InnerDest>()
                .ForMember(d => d.InnerInner, opts => opts.Ignore());

            var source = new OuterSource { Inner = new InnerSource { InnerInner = new InnerInnerSource { Value = 25 } } };

            var destination = new OuterDest { Inner = new InnerDest { InnerInner = new InnerInnerDest { Value = 99 } } };

            Mapper.Map(source, destination);

            Assert.That(99 == destination.Inner.InnerInner.Value);  // FAIL - destination.Inner.InnerInner is null
        }
    }

Похоже, опция игнорирования работает не полностью. Если я прокомментирую в первом «игнорировать», то все будет работать, как ожидалось. Проблема в том, что во внутреннем классе есть ряд других свойств, которые мне нужно сопоставить. Единственный, что нужно игнорировать, это класс InnerInner.

Есть идеи? Та же проблема, я думаю, была изложена здесь , но принятый ответ не работает для меня.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Рекомендуемый способ использования AutoMapper - это отображение типов, как указано в ссылочном посте.Таким образом, вы никогда не создаете целевой объект, просто укажите тип, который вы хотите отобразить.

var dest = Mapper.Map<OuterSource, OuterDest>(source);

Можно ли использовать его таким образом, а затем установить значение dest.InnerInner равнымболее поздний момент времени?

0 голосов
/ 25 июля 2012
Mapper.CreateMap<InnerSource, InnerDest>()
    .ForMember(d => d.InnerInner, opts => opts.UseDestinationValue());

Mapper.CreateMap<OuterSource, OuterDest>()
    .ForMember(d => d.Inner, opts => opts.UseDestinationValue())
    .AfterMap((source, destination) => Mapper.Map(source.Inner, destination.Inner));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...