Come configurare il mapping AutoMapper quando si desidera utilizzare il comportamento dal metodo UseDestinationValue
, ma solo quando la proprietà di destinazione NON è null
.UseDestinationValue solo quando la proprietà di destinazione non è null
Qualcosa del genere:
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; }
}
Ora esempio di utilizzo. Ho una classe ItemViewModel
e desidero associarla alla classe Item
.
configurazione Mapping:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue())
Primo caso - proprietà di destinazione
Item.Details
proprietà non è NULL. Ora voglio AutoMapper per utilizzare questa istanza di destinazione della proprietàDetails
, perché non è nulla.E la logica assomiglia a questo:
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, a causa della presenza di
UseDestinationValue
, lascerà l'istanzaitem.Details
e impostare soloitem.Details.Info
proprietà.Secondo caso - proprietà di destinazione
Item.Details
proprietà è NULL. Ora voglio AutoMapper per non utilizzare questa istanza nulla, ma crearne una nuova. La domanda è come configurare la mappatura per tenere conto di questo caso?La logica assomiglia a questo:
var item = new Item { Details = null }; var itemViewModel = new ItemViewModel { Details = new DetailsViewModel { Info = "New text" } }; Mapper.Map(itemViewModel, item);
PROBLEMA
Qui ho un problema, perché dopo la mappatura, la proprietà
item.Details
sarà nulla (a causa di utilizzo diUseDestinationValue
che ènull
in questo caso).
MOTIVO
NHibernate, dopo aver ottenuto l'entità dal database, lo mette in un proxy. Quindi la proprietà Details
di un oggetto caricato non è di un tipo: ItemDetails
, ma ItemDetailsNHibernateProxy
- quindi devo usare questo tipo, quando voglio salvare questo oggetto esistente nel database in un secondo momento. Ma se questa proprietà è null
, allora non posso usare un valore di destinazione nullo, quindi Automapper dovrebbe creare una nuova istanza.
Grazie, Chris
Quindi vuoi fare qualcosa di diverso UseDestinationValue se è nullo? – PatrickSteele
Sì, voglio fare qualcos'altro quando la proprietà di destinazione È NULL. – cryss
Puoi fornire qualche esempio di codice funzionante che ti mostri come vuoi che le cose vengano mappate rispetto a ciò che Auotmapper fa attualmente. Non sto ottenendo quello che stai chiedendo. – PatrickSteele