AutoMapper и "UseDestinationValue"

Что делает UseDestinationValue?

Я спрашиваю, потому что у меня есть базовый и унаследованный класс, а для базового класса я бы хотел, чтобы AutoMapper использовал для меня существующие значения.

Будет ли это делать? (Я посмотрел, и единственные примеры, которые я вижу для UseDestinationValue, включают списки. Это только для списков?

Могу ли я сделать это:

PersonContract personContract = new PersonContract {Name = 'Dan'};
Person person = new Person {Name = "Bob"};
Mapper.CreateMap<PersonContract, Person>()
      .ForMember(x=>x.Name, opt=>opt.UseDestinationValue());

person = Mapper.Map<PersonContract, Person>(personContract);

Console.WriteLine(person.Name);

и вывод должен быть bob?

Ответ 1

Я написал весь этот вопрос и подумал, ДУХ! просто запустите его и посмотрите.

Он работает так, как я надеялся.

Это код, в котором я закончил:

class Program
{
    static void Main(string[] args)
    {
        PersonContract personContract = new PersonContract {NickName = "Dan"};
        Person person = new Person {Name = "Robert", NickName = "Bob"};
        Mapper.CreateMap<PersonContract, Person>()
            .ForMember(x => x.Name, opt =>
                                        {
                                            opt.UseDestinationValue();
                                            opt.Ignore();
                                        });

        Mapper.AssertConfigurationIsValid();

        var personOut = 
            Mapper.Map<PersonContract, Person>(personContract, person);

        Console.WriteLine(person.Name);
        Console.WriteLine(person.NickName);

        Console.WriteLine(personOut.Name);
        Console.WriteLine(personOut.NickName);
        Console.ReadLine();
    }
}

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

internal class PersonContract
{
    public string NickName { get; set; }
}

Выход был:

Роберт
Dan
Роберт
Dan

Ответ 2

Меня сюда привел аналогичный вопрос, но в отношении вложенных классов и сохранения значения назначения. Я пробовал все, что мог, но это не сработало для меня, оказалось, что вы также должны использовать UseDestinationValue для родительского объекта. Я оставляю это здесь, если у кого-то еще есть такая же проблема. Мне потребовалось некоторое время, чтобы заставить его работать. Я все время думал, что проблема заключается в адресе AddressViewModel = > Address mapping.

В классе BidderViewModel BidderAddress имеет тип AddressViewModel. Мне нужно, чтобы идентификатор адреса сохранялся в ситуациях, когда он не равен нулю.

Mapper.CreateMap<BidderViewModel, Bidder>()
    .ForMember(dest => dest.BidderAddress, opt=> opt.UseDestinationValue())
    .ForMember(dest => dest.ID, opt => opt.UseDestinationValue());
Mapper.CreateMap<AddressViewModel, Address>()
    .ForMember(dest => dest.ID, opt => { opt.UseDestinationValue(); opt.Ignore(); });

Использовать (где viewModel имеет тип BidderViewModel, возвращаемый представлением в MVC):

Bidder bidder = Mapper.Map<BidderViewModel, Bidder>(viewModel, currentBid.Bidder)