Automapper игнорирует игнорировать свойства - PullRequest
8 голосов
/ 23 марта 2011

Я хотел бы игнорировать некоторые свойства при отображении глубинных (то есть уровней> 1) объектных моделей.

Следующий тест работает нормально:

class Foo
{
    public string Text { get; set; }
}

class Bar
{
    public string Text { get; set; }
}

Mapper.CreateMap<Foo, Bar>()
      .ForMember(x => x.Text, opts => opts.Ignore());

var foo = new Foo { Text = "foo" };
var bar = new Bar { Text = "bar" };
Mapper.Map(foo, bar);
Assert.AreEqual("bar", bar.Text);

Однако, когда я пытаюсь сделатьто же самое отображение, но с Foo и Bar в качестве свойств родительского класса, следующий тест не пройден:

class ParentFoo
{
    public Foo Child { get; set; }
}

class ParentBar
{
    public Bar Child { get; set; }
}

Mapper.CreateMap<ParentFoo, ParentBar>();

Mapper.CreateMap<Foo, Bar>()
      .ForMember(x => x.Text, opts => opts.Ignore());

var parentFoo = new ParentFoo          
{
    Child = new Foo { Text = "foo" }
};

var parentBar = new ParentBar
{
    Child = new Bar { Text = "bar" }
};

Mapper.Map(parentFoo, parentBar);
Assert.AreEqual("bar", parentBar.Child.Text);

Вместо того, чтобы игнорировать текст класса Child (т.е. оставить его как "bar"), автоматическое преобразование устанавливает значение вноль.Что я делаю не так с моей конфигурацией отображения?

1 Ответ

10 голосов
/ 23 марта 2011

Есть два способа, которыми Automapper может выполнить отображение.Первый способ - просто дать Automapper ваш исходный объект, и он создаст новый целевой объект и заполнит все для вас.Именно так большинство приложений используют Automapper.Тем не менее, второй способ - указать ему источник и существующий пункт назначения, и Automapper обновит существующий пункт назначения вашими сопоставлениями.

В первом примере вы задаете ему существующее значение пункта назначения, поэтому Automapper будетиспользуйте это.Во втором примере Automapper собирается выполнить сопоставление для ParentFoo и ParentBar, но когда он добирается до Child, он собирается создать нового Child и затем выполнить сопоставление (это поведение по умолчанию).Это приводит к тому, что свойство Text имеет значение null.Если вы хотите использовать существующий дочерний объект, вам нужно настроить Automapper для этого с UseDestinationValue:

Mapper.CreateMap<ParentFoo, ParentBar>()
    .ForMember(b => b.Child, o => o.UseDestinationValue());

Это сделает ваш тестовый проход (до тех пор, пока вы избавляетесь от первого пробела при настройкеthe parentBar.Child.Text!).

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