如何从ViewModel映射到Model

本文关键字:Model 映射 ViewModel | 更新日期: 2023-09-27 18:06:14

我有一个像这样的模型和ViewModel

public class Estate : BaseEntity
{       
    public virtual BaseInformation floorType { get; set; }     
}
public class BaseInformation:BaseEntity 
{ 
    public string Name { get; set; }     
    public virtual BaseInformationHeader Master { get; set; }
}
public class EstateViewModel : BaseEntityViewModel
{       
    public  long floorType { get; set; }     
}

和控制器中的代码:

[HttpPost]
public long save(EstateViewModel estateViewModel)
{
    Estate entity = new Estate();
    BaseInformation bi = new BaseInformation();
    bi.id = 1;
    entity.floorType = bi;
    EstateViewModel ev = new EstateViewModel(); 
    Mapper.CreateMap<EstateViewModel, Estate>();
    var model = AutoMapper.Mapper.Map<EstateViewModel,Estate>(estateViewModel);
    return estateRepository.save(entity);
}

当操作被执行时,AutoMapper抛出以下异常:

类型为'AutoMapper '的异常。AutoMapperMappingException的发生在AutoMapper.dll中,但未在用户代码

中处理

是什么导致这种情况发生?

如何从ViewModel映射到Model

我的问题解决方案在这里找到:http://cpratt.co/using-automapper-creating-mappings/代码是这样的:

AutoMapper.Mapper.CreateMap<PersonDTO, Person>()
.ForMember(dest => dest.Address,
           opts => opts.MapFrom(
               src => new Address
               {
                   Street = src.Street,
                   City = src.City,
                   State = src.State,
                   ZipCode = src.ZipCode
               }));

查看内部异常-它为您提供了对问题的良好描述。我还会考虑在其他地方的静态方法中设置所有的CreateMap调用,该方法在app start:

时调用
public class AutoMapperConfiguration
{
    public static void Configure()
    {
         Mapper.CreateMap<EstateViewModel, Estate>();          
    }
}

然后在global。asax:

protected void Application_Start()
{
    AutoMapperConfiguration.Configure();
}

[Update] -将属性映射到其他具有不同名称的属性:

Mapper.CreateMap<ViewModel, Model>()
                  .ForMember(dest => dest.Id, o => o.MapFrom(src => src.DestinationProp));

你的问题是源属性是一个long,而目标是一个复杂类型——你不能从源映射到目标,因为它们不是相同的类型。

(更新2)

如果BaseInformation

。Id是一个长,那么你应该可以这样做:

Mapper.CreateMap<ViewModel, Model>()
                  .ForMember(dest => dest.Id, o => o.MapFrom(src => src.floorType ));

你的模型不是很清楚