ASP.NET MVC4 AutoMapper:到达Controller时丢失映射

时间:2012-10-10 06:53:39

标签: asp.net asp.net-mvc-4 automapper

我有一个奇怪的情况,我无法弄清楚。我有一个简单的ASP.NET MVC4应用程序,并使用AutoMapper在ViewModel和实体(DB)对象之间移动数据。

我正在努力解决的问题是,当我在CustomerController中到达Application_Start()时,Create()中的AutoMapper配置似乎消失了。

如果我在Create()方法中调用了Configure,则从CustomerViewModel到CustomerEntity的映射可以正常工作。

我已经浏览过互联网,并没有看到有人报告这个问题,所以希望有人能给我一些线索。以下是详细信息......我希望有人有一些建议,因为它让我发疯! :P

在global.asax.cs中,在Application_Start()中,我在我的类上调用configure()方法:

AutoMapperConfigurator.Configure();

这是班级:

public class AutoMapperConfigurator
{
    public static void Configure() 
    {
        Mapper.Initialize(x => x.AddProfile<AutoMappingProfile>()); 
    }
}

AutomMappingProfile是我的AutoMapper个人资料类。它的实施如下:

public class AutoMappingProfile : Profile    

    public override string ProfileName        
    {          
        get { return "AutoMappingProfile";}     
    }       

    protected override void Configure()  
    {
        CreateMaps();  
    }

    private void CreateMaps()  
    {
        CreateMap<CustomerEntity, CustomerEntity>();
        CreateMap<CustomerViewModel, CustomerViewModel>();
        CreateMap<CustomerEntity, CustomerViewModel>().IgnoreAllNonExisting();
        CreateMap<CustomerViewModel, CustomerEntity>().IgnoreAllNonExisting();

        CreateMap<CustomerVendorProductEntity, CustomerVendorProductEntity>();
        CreateMap<CustomersVendorsProductViewModel, CustomersVendorsProductViewModel>();
        CreateMap<CustomerVendorProductEntity, CustomersVendorsProductViewModel>().IgnoreAllNonExisting();
        CreateMap<CustomersVendorsProductViewModel, CustomerVendorProductEntity>().IgnoreAllNonExisting();
    } 
}

我在CreateMaps()上设置了一个断点,并看到它在应用程序启动时被调用。

当我调用一个动作来创建一个新的Customer实体时,会调用CustomerController中的Create()方法。

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create([DataSourceRequest] DataSourceRequest request, CustomerViewModel vm)
    {
    .
    .
    var customer = AutoMapper.Mapper.Map<CustomerViewModel, CustomerEntity>(vm);
    .
    .   
}

从List到Collection的映射,映射始终失败并显示NotSupportedException

我已经实现了ListSourceMapper,它在Configure()中作为Mapper加载。我没有在这里展示,因为它有效...我正在努力的问题是,当我在CustomerController中到达Create()时,我在Application_Start()中配置AutoMapper似乎消失了。如果我在Create()方法中调用Configure,则从CustomerViewModel到CustomerEntity的映射可以正常工作。我已经浏览过互联网,并没有看到有人报告这个问题,所以希望有人能给我一些线索。

1 个答案:

答案 0 :(得分:0)

我去年有类似的问题,我在这里描述:

ASP.NET MVC4 AutoMapper: Loses mapping when reach a Controller

我有一个控制器,它有以下构造函数:

 IApplicationDAO applicationDAO = new ApplicationDAO();
 public ApplicationController()
        {
            Mapper.Initialize(cfg => {
                cfg.CreateMap<ApplicationModel, BusinessObjects.Application>();
            });

和一个数据对象,它有以下构造函数:

public ApplicationDAO()
        {
            Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<BusinessObjects.Application, DataObjects.dbApplication>()
                   .ReverseMap();
            });
        }

数据对象创建一次并由构造函数多次调用。每次构造函数调用数据对象时,它都会覆盖ApplicationDAO中设置的映射,这意味着AutoMapper始终会产生错误。

我的解决方案是确保在合成根中创建所有映射,即Global.asax。