我有一个平面POCO实体和一个结构化视图模型(用于使用自定义EditorFor帮助器渲染表单)。
在Automapper 2中有更简单的方法可以做类似的事情:
cfg.CreateMap<TelcoDemand, TelcoDemandViewModel>()
.ForMember(d => d.Person, opt => opt.ResolveUsing(s => new PersonViewModel
{
FirstName = s.PersonFirstName,
LastName = s.PersonLastName,
Phone = s.PersonPhone,
Email = s.PersonEmail
}))
.ForMember(d => d.AddressContact, opt => opt.ResolveUsing(s => new AddressViewModel
{
City = s.AddressContactCity,
HouseNumber = s.AddressContactHouseNumber,
Street = s.AddressContactStreet,
Zip = s.AddressContactZip
}))
.ForMember(d => d.AddressCourier, opt => opt.ResolveUsing(s => new AddressViewModel
{
City = s.AddressCourierCity,
HouseNumber = s.AddressCourierHouseNumber,
Street = s.AddressCourierStreet,
Zip = s.AddressCourierZip
}))
.ForMember(d => d.Address, opt => opt.ResolveUsing(s => new AddressViewModel
{
City = s.AddressCity,
HouseNumber = s.AddressHouseNumber,
Street = s.AddressStreet,
Zip = s.AddressZip
}))
我想要实现的是将Person和Address字段解压缩到viewmodel中,然后使用EditorFor渲染。
将它展平回数据库效果很好,但是我无法按照惯例获得不讨人喜欢的工作......
修改
我在这里使用了一个IgnoreAllUnexisting扩展,它的实现方式如下:
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType == sourceType && x.DestinationType == destinationType);
foreach (var property in existingMaps.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
expression.ForAllMembers(opt => opt.Condition(src => !src.IsSourceValueNull));
return expression;
}
无论如何,我也试过没有那个扩展,结果就是一样 - 复杂类型中的一堆空值。