3

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

我要解决的问题是,当我到达CustomerController时,我对 AutoMapper 的配置Application_Start()似乎消失了。Create()

如果我在该方法中调用 Configure,Create()则从 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()并看到它在应用程序启动时被调用。

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

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

映射总是失败,NotSupportedException从列表到集合的映射。

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

4

1 回答 1

0

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

ASP.NET MVC4 AutoMapper:到达控制器时丢失映射

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

 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。

于 2017-07-02T13:52:52.530 回答