У меня есть отображение для копирования человека и состояния, но когда я копирую состояние, мне не нужна глубокая копия человека, только ссылка, но я использую automapper для создания глубокой копии человека где-то еще, так что там это отображение для человека и для государства.

    public class Person
    {
        public string Name { get; set; }
    }

    public class State
    {
        public string Name { get; set; }
        public Person CreatedBy { get; set; }
    }

    [TestMethod]
    public void CopyByReference()
    {
        Mapper.CreateMap<Person, Person>();
        Mapper.CreateMap<State, State>();

        var original = new State { Name = "Start", CreatedBy = new Person { Name = "Employee name" } };
        var copy = Mapper.Map<State>(original);
        Assert.AreEqual(original.Name, copy.Name);
        if (!ReferenceEquals(original.CreatedBy, copy.CreatedBy))
        {
            throw new Exception("I need a reference copy, not deep copy.");
        }
    }

Я попытался реализовать IValueResolver, но у меня тоже есть глубокая копия. Я мог бы просто проигнорировать свойство CreatedBy и скопировать ссылку после сопоставления, но это довольно некрасиво и выглядит очень подверженным ошибкам.

4
jahav 29 Июн 2014 в 20:48

2 ответа

Лучший ответ

Automapper на самом деле не предназначен для этого, поэтому он всегда будет пытаться использовать сопоставление, если найдет его, поэтому он всегда пытается сопоставить ваши объекты Person ...

Один из способов обхода проблемы - Ignore CreatedBy на вашем State и скопировать его в обратном вызове AfterMap:

Mapper.CreateMap<State, State>()
    .ForMember(d => d.CreatedBy, c => c.Ignore())
    .AfterMap((src, dest) => { dest.CreatedBy = src.CreatedBy; });
3
nemesv 29 Июн 2014 в 19:36

Вы можете удалить эту строку: Mapper.CreateMap<Person, Person>();

Это должно заставить AutoMapper скопировать ссылку, а не выполнять глубокую копию.

0
Denis González 10 Июл 2015 в 19:52