Cómo configurar la asignación de AutoMapper cuando quiero usar el comportamiento desde el método UseDestinationValue
, pero solo cuando la propiedad de destino NO es null
.UseDestinationValue solo cuando la propiedad de destino no es nula
Algo así:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue(dontUseWhenNullDestination: true))
EDITAR
class ItemDetails {
public string Info { get; set; }
public string ImportantData { get; set; } // only in Domain, not in ViewModel
}
class Item {
public ItemDetails Details { get; set; }
}
class ItemDetailsViewModel {
public string Info { get; set; }
}
class ItemViewModel {
public ItemDetailsViewModel Details { get; set; }
}
Ahora ejemplo de uso. Tengo una clase ItemViewModel
y quiero asignarla a la clase Item
.
configuración de asignación:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue())
Primer caso - propiedad de destino
Item.Details
propiedad no es nulo. Ahora quiero que AutoMapper use esta instancia de destino de la propiedadDetails
, porque no es nulo.Y la lógica es similar a esto:
var item = new Item { Details = new Details { Info = "Old text", ImportantData = "Data" } }; var itemViewModel = new ItemViewModel { Details = new DetailsViewModel { Info = "New text" } }; Mapper.Map(itemViewModel, item);
AutoMapper, debido a la presencia de
UseDestinationValue
, dejará la instanciaitem.Details
y establecer solamenteitem.Details.Info
propiedad.Segundo caso - propiedad de destino
Item.Details
propiedad es NULL. Ahora quiero que AutoMapper no use esta instancia nula, pero cree una nueva. La pregunta es cómo configurar el mapeo para tener en cuenta este caso.La lógica es similar a esto:
var item = new Item { Details = null }; var itemViewModel = new ItemViewModel { Details = new DetailsViewModel { Info = "New text" } }; Mapper.Map(itemViewModel, item);
PROBLEMA
Aquí tengo un problema, porque después de la cartografía, la propiedad
item.Details
será nulo (debido al uso deUseDestinationValue
que esnull
en este caso).
RAZÓN
NHibernate, después de conseguir la entidad de la base de datos, lo pone en un proxy. Entonces, la propiedad Details
de un objeto cargado no es de un tipo: ItemDetails
, sino ItemDetailsNHibernateProxy
, así que tengo que usar este tipo, cuando deseo guardar este objeto existente en la base de datos más adelante. Pero si esta propiedad es null
, entonces no puedo usar un valor de destino nulo, por lo que Automapper debe crear una nueva instancia.
Gracias, Chris
Entonces, ¿quieres hacer algo que no sea UseDestinationValue si es nulo? – PatrickSteele
Sí, deseo hacer algo más cuando la propiedad de destino ES NULA. – cryss
¿Podría proporcionar algún código de muestra de trabajo que le muestre cómo desea que las cosas se asignen frente a lo que Auotmapper hace actualmente? No entiendo lo que estás preguntando. – PatrickSteele