当我想使用UseDestinationValue
方法中的行为时如何配置 AutoMapper 映射,但仅当目标属性为 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
属性不为空。现在我希望 AutoMapper使用这个属性的目标实例Details
,因为它不为空。逻辑如下所示:
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
属性。第二种情况 - 目标属性
Item.Details
属性为 NULL。现在我希望 AutoMapper不使用这个空实例,而是创建一个新实例。问题是如何配置映射以考虑这种情况?逻辑如下所示:
var item = new Item { Details = null }; var itemViewModel = new ItemViewModel { Details = new DetailsViewModel { Info = "New text" } }; Mapper.Map(itemViewModel, item);
问题
这里我有一个问题,因为映射后,该
item.Details
属性将为空(因为在这种情况下使用UseDestinationValue
它null
)。
原因
NHibernate 从数据库中获取实体后,将其放入代理中。所以Details
加载对象的属性不是 type: ItemDetails
,而是ItemDetailsNHibernateProxy
- 所以我必须使用这种类型,当我想稍后将这个现有对象保存到数据库中时。但是如果这个属性是null
,那么我不能使用空目标值,所以 Automapper 应该创建一个新实例。
谢谢,克里斯