How to configure AutoMapper mapping when I want to use behaviour from UseDestinationValue
method, but only when destination property is NOT null
.
Something like that:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue(dontUseWhenNullDestination: true))
EDIT
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; }
}
Now example of usage. I have a ItemViewModel
class and I want to map it to the Item
class.
Mapping configuration:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue())
First case - destination property
Item.Details
property is NOT NULL. Now I want AutoMapper to use this destination instance ofDetails
property, because it's not null.And the logic looks like this:
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, because of presence of
UseDestinationValue
, will leave theitem.Details
instance and set onlyitem.Details.Info
property.Second case - destination property
Item.Details
property is NULL. Now I want AutoMapper not to use this null instance, but create new one. The question is how to configure the mapping to take into account this case?The logic looks like this:
var item = new Item { Details = null }; var itemViewModel = new ItemViewModel { Details = new DetailsViewModel { Info = "New text" } }; Mapper.Map(itemViewModel, item);
PROBLEM
Here I have a problem, because after mapping, the
item.Details
property will be null (because of usage ofUseDestinationValue
which isnull
in this case).
REASON
NHibernate, after getting the entity from the database, puts it into a proxy. So the Details
property of a loaded object is not of a type: ItemDetails
, but ItemDetailsNHibernateProxy
- so I have to use this type, when I want to save this existing object to the database later. But if this property is null
, then I can't use a null destination value, so Automapper should create a new instance.
Thanks, Chris