So konfigurieren Sie die AutoMapper-Zuordnung, wenn ich das Verhalten von UseDestinationValue
Methode verwenden möchte, aber nur, wenn die Zieleigenschaft nicht null
ist.UseDestinationValue nur, wenn die Zieleigenschaft nicht null ist
So etwas:
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; }
}
Jetzt Beispiel für die Nutzung. Ich habe eine ItemViewModel
Klasse und ich möchte sie der Klasse Item
zuordnen.
Mapping-Konfiguration:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue())
Erster Fall - Ziel Eigenschaft
Item.Details
Eigenschaft ist NOT NULL. Jetzt möchte ich AutoMapper diese Zielinstanz vonDetails
Eigenschaft verwenden, weil es nicht null ist.Und die Logik sieht wie folgt aus:
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, wegen des Vorhandenseins von
UseDestinationValue
, dieitem.Details
Instanz und setzen nuritem.Details.Info
Eigenschaft verlassen.Zweiter Fall - Zieleigenschaft
Item.Details
Eigenschaft ist NULL. Jetzt möchte ich AutoMapper nicht diese Null-Instanz verwenden, sondern neue erstellen. Die Frage ist, wie man das Mapping konfiguriert, um diesen Fall zu berücksichtigen?Die Logik sieht wie folgt aus:
var item = new Item { Details = null }; var itemViewModel = new ItemViewModel { Details = new DetailsViewModel { Info = "New text" } }; Mapper.Map(itemViewModel, item);
PROBLEM
Hier habe ich ein Problem, weil nach der Kartierung, die
item.Details
Eigenschaft null sein wird (wegen der Verwendung vonUseDestinationValue
dienull
ist in dieser Fall).
GRUND
NHibernate, nachdem die Entität aus der Datenbank bekommen, es in einen Proxy stellt. Also die Details
Eigenschaft eines geladenen Objekts ist nicht vom Typ: ItemDetails
, aber ItemDetailsNHibernateProxy
- also muss ich diesen Typ verwenden, wenn ich dieses vorhandene Objekt später in der Datenbank speichern möchte. Aber wenn diese Eigenschaft null
ist, dann kann ich keinen Null-Zielwert verwenden, daher sollte Automapper eine neue Instanz erstellen.
Danke, Chris
So tun Sie etwas anderes als UseDestinationValue tun wollen wenn es null ist? – PatrickSteele
Ja, ich möchte etwas anderes tun, wenn die Zieleigenschaft NULL ist. – cryss
Können Sie einen funktionierenden Beispielcode bereitstellen, der Ihnen zeigt, wie Sie die Dinge gemappt werden möchten, im Gegensatz zu dem, was Auotmapper derzeit tut. Ich bekomme einfach nicht, was du verlangst. – PatrickSteele