2011-08-16 25 views
5

¿Qué hace UseDestinationValue?AutoMapper y "UseDestinationValue"

Pregunto porque tengo una clase base y heredada, y para la clase base, me encantaría que AutoMapper tomara los valores existentes para mí.

¿Lo hará? (He mirado y los únicos ejemplos que puedo ver por UseDestinationValue a listas ¿Es sólo para las listas

podría hacer esto:.??

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); 

y tienen la salida sea sacudida

Respuesta

3

escribí toda esta cuestión y luego se lo pensó, DUH! sólo ejecutarlo y ver.

funciona como había esperado.

Este es el código que terminó con:

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; } 
} 

La salida fue:

Robert
Dan
Robert
Dan

+4

Esto es lo mismo que simplemente usando Ignorar(). – Monstieur

1

Me trajeron aquí con una pregunta similar, pero con respecto a las clases anidadas y mantener el valor de destino. Intenté arriba de cualquier manera que pude, pero no funcionó para mí, resulta que debes usar UseDestinationValue en el objeto padre también. Dejo esto aquí en caso de que alguien más tenga el mismo problema que yo. Me llevó algo de tiempo hacerlo funcionar. Seguí pensando que el problema radica en AddressViewModel => asignación de direcciones.

En la clase BidderViewModel, BidderAddress es del tipo AddressViewModel. Necesitaba la ID de dirección para preservarla en situaciones en las que no es nula.

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(); }); 

uso (cuando viewmodel es de tipo BidderViewModel como devuelta por la vista en MVC):

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