メソッドからの動作を使用したい場合に 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.Details
item.Details.Info
2 番目のケース - 宛先プロパティ
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 は新しいインスタンスを作成する必要があります。
ありがとう、クリス