C# Automapper 2-取消实体到虚拟机的平台

C# Automapper 2-取消实体到虚拟机的平台,c#,asp.net-mvc-4,automapper,automapper-2,C#,Asp.net Mvc 4,Automapper,Automapper 2,我有一个平面POCO实体和一个结构化视图模型(用于使用自定义编辑器呈现表单) 在Automapper 2中是否有更简单的方法来执行类似操作: cfg.CreateMap<TelcoDemand, TelcoDemandViewModel>() .ForMember(d => d.Person, opt => opt.ResolveUsing(s => new PersonViewModel { FirstName = s.PersonFirs

我有一个平面POCO实体和一个结构化视图模型(用于使用自定义编辑器呈现表单)

在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
    }))
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;
}
cfg.CreateMap()
.FormMember(d=>d.Person,opt=>opt.ResolveUsing(s=>new PersonViewModel
{
FirstName=s.PersonFirstName,
LastName=s.PersonLastName,
电话,
Email=s.PersonEmail
}))
.FormMember(d=>d.AddressContact,opt=>opt.ResolveUsing(s=>new AddressViewModel
{
城市=南部城市,
HouseNumber=s.AddressContactHouseNumber,
街道=南街,
Zip=s.AddressContactZip
}))
.FormMember(d=>d.AddressCourier,opt=>opt.ResolveUsing(s=>new AddressViewModel
{
城市=s.AddressCourierCity,
HouseNumber=s.AddressCourierHouseNumber,
街道=s.AddressCourierStreet,
Zip=s.AddressCourierZip
}))
.FormMember(d=>d.Address,opt=>opt.ResolveUsing(s=>new AddressViewModel
{
城市=s.AddressCity,
HouseNumber=s.AddressHouseNumber,
街道=南街,
Zip=s.AddressZip
}))
我试图实现的是将Person和Address字段解压缩到viewmodel中,然后使用EditorFor渲染

将其扁平化回数据库效果很好,但我不可能按照惯例让不平坦的工作正常进行

编辑

我在这里还使用了一个IgnoreAllUnexisting扩展,它的实现如下:

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
    }))
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;
}
public静态IMappingExpression ignoreallnoexisting(此IMappingExpression表达式)
{
var sourceType=typeof(TSource);
var destinationType=typeof(TDestination);
var existingMaps=Mapper.GetAllTypeMaps().First(x=>x.SourceType==SourceType&&x.DestinationType==DestinationType);
foreach(existingMaps.GetUnmappedPropertyNames()中的var属性)
{
expression.ForMember(属性,opt=>opt.Ignore());
}
expression.ForAllMembers(opt=>opt.Condition(src=>!src.IsSourceValueNull));
返回表达式;
}

不管怎样,我也在没有扩展的情况下尝试了它,结果是一样的——在复杂类型中有一堆空值。

当您尝试按约定取消flatten时,是否有任何异常?或者,在
TelcoDemandViewModel
实例中,您只是得到了一堆空值吗?我只是得到了一堆空值。请参阅原始帖子,我添加了更多的解释。为了澄清,是在
TelcoDemandViewModel
实例上还是嵌套的
PersonViewModel
AddressViewModel
实例上的空值?如果是前者,您是否尝试过在TelcoDemand viewmodel构造函数中实例化Person&Address viewmodels?我在单元测试中断言
td.Address.City
,并且没有得到空引用异常,因此嵌套的VM被正确实例化。实际上我已经在构造函数中有了它们。因此,空值位于嵌套实例的属性中。