cry*_*yss 6 .net c# automapper
当我想使用UseDestinationValue方法中的行为时,如何配置AutoMapper映射,但仅当目标属性为NOT时才配置AutoMapper映射null.
像这样的东西:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue(dontUseWhenNullDestination: true))
Run Code Online (Sandbox Code Playgroud)
编辑
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; }
}
Run Code Online (Sandbox Code Playgroud)
现在使用的例子.我有一个ItemViewModel班级,我想把它映射到Item班级.
映射配置:
Mapper.CreateMap<Item, ItemViewModel>()
.ForMember(x => x.Details, _ => _.UseDestinationValue())
Run Code Online (Sandbox Code Playgroud)
第一种情况 - 目标属性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);
Run Code Online (Sandbox Code Playgroud)
由于存在,AutoMapper UseDestinationValue将保留item.Details实例并仅设置item.Details.Info属性.
第二种情况 - 目标属性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);
Run Code Online (Sandbox Code Playgroud)
问题
这里我有一个问题,因为在映射之后,item.Details属性将为null(因为在这种情况下使用UseDestinationValue它null).
原因
从数据库中获取实体后,NHibernate将其放入代理中.所以Details加载对象的属性不是类型:ItemDetails,但是ItemDetailsNHibernateProxy- 所以当我想稍后将这个现有对象保存到数据库时,我必须使用这种类型.但是如果这个属性是null,那么我不能使用null目标值,因此Automapper应该创建一个新实例.
谢谢,克里斯
我认为这个NullSubstitute选项适合你。请参阅:http ://weblogs.asp.net/psteele/archive/2011/03/18/automapper-handling-null-members.aspx
编辑
看起来您可能需要在详细信息映射中添加一些条件逻辑(并跳过该UseDestinationValue选项):
.ForMember(d => d.Details,
o => o.MapFrom(s => s.Details == null ? new ItemDetails() : Mapper.Map<ItemDetailsViewModel, ItemDetails>(s.Details))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3030 次 |
| 最近记录: |