2011-03-23 20 views
7

Me gustaría ignorar ciertas propiedades al mapear modelos de objetos profundos (es decir, niveles> 1).Automatizador ignorando ignorar propiedades

La siguiente prueba funciona bien:

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

Sin embargo, cuando trato de hacer lo mismo mapeo pero tienen Foo y Bar como propiedades de una clase padre la siguiente prueba falla:

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

lugar de ignorar el texto de la clase Child (es decir, dejarlo como "barra"), Automapper establece el valor en nulo. ¿Qué estoy haciendo mal con mi configuración de mapeo?

Respuesta

9

Existen dos formas en que Automapper puede realizar la asignación. La primera es simplemente darle a Automapper su objeto de origen y creará un nuevo objeto de destino y lo poblará todo por usted. Esta es la forma en que la mayoría de las aplicaciones usan Automapper. Sin embargo, la segunda forma es darle tanto una fuente como un destino existente y Automapper actualizará el destino existente con sus asignaciones.

En el primer ejemplo, le está dando un valor de destino existente para que Automapper lo use. En el segundo ejemplo, Automapper hará la asignación para ParentFoo y ParentBar, pero cuando llegue al Niño, creará un nuevo Niño y luego realizará la asignación (este es el comportamiento predeterminado). Esto da como resultado que la propiedad Text sea nula. Si desea utilizar el objeto secundario existente, tendrá que configurar AutoMapper de hacer eso con UseDestinationValue:

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

Esto hace que su paso de la prueba (siempre y cuando a deshacerse del primer espacio cuando se ajusta el parentBar .Child.Text!).

+0

Gracias Patrick. ¡Perfecto! Solo había pensado en UseDestinationValue en el contexto de las colecciones de objetivos, pero ahora todo tiene sentido. – Brownie

Cuestiones relacionadas