メソッドからの動作を使用したい場合に AutoMapper マッピングを構成するUseDestinationValue方法ですが、宛先プロパティが NOT の場合のみですnull。
そんな感じ:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue(dontUseWhenNullDestination: true))
編集
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; }
}
では使用例です。クラスがItemViewModelあり、それをクラスにマップしたいと考えていますItem。
マッピング構成:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue())
最初のケース - 宛先プロパティ
Item.Detailsプロパティが NOT NULL です。ここで、AutoMapperにプロパティのこの宛先インスタンスを使用さDetailsせたいと考えています。これは null ではないためです。ロジックは次のようになります。
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はインスタンス
UseDestinationValueを離れ、プロパティのみを設定します。item.Detailsitem.Details.Info2 番目のケース - 宛先プロパティ
Item.Detailsプロパティが NULL です。ここで、AutoMapperでこの null インスタンスを使用せずに、新しいインスタンスを作成したいと考えています。問題は、このケースを考慮してマッピングを構成する方法です。ロジックは次のようになります。
var item = new Item { Details = null }; var itemViewModel = new ItemViewModel { Details = new DetailsViewModel { Info = "New text" } }; Mapper.Map(itemViewModel, item);問題
ここで問題があります。マッピング後、
item.Detailsプロパティが null になるためです (この場合の使用法のためUseDestinationValue)null。
理由
Hibernate は、データベースからエンティティーを取得した後、それをプロキシーに入れます。したがって、Details読み込まれたオブジェクトのプロパティは型ではありません:ですItemDetailsが、ItemDetailsNHibernateProxyこの既存のオブジェクトを後でデータベースに保存する場合は、この型を使用する必要があります。しかし、このプロパティがnullの場合、null の宛先値は使用できないため、Automapper は新しいインスタンスを作成する必要があります。
ありがとう、クリス