Automapper 2 - 虚拟实体到VM

时间:2013-03-13 10:31:31

标签: c# asp.net-mvc-4 automapper automapper-2

我有一个平面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;
}

无论如何,我也试过没有那个扩展,结果就是一样 - 复杂类型中的一堆空值。

0 个答案:

没有答案