我有一个奇怪的情况,我无法弄清楚。我有一个简单的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的映射可以正常工作。我已经浏览过互联网,并没有看到有人报告这个问题,所以希望有人能给我一些线索。
答案 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。