Automapper,Mapper未初始化。 使用正确的配置调用初始化
当我尝试将数据提交到数据库时,我收到以下错误:
{“Success”:false,“Error”:true,“ErrorType”:2,“Message”:“System.InvalidOperationException:Mapper未初始化。使用适当的配置调用Initialize。如果您尝试通过容器使用映射器实例或否则,请确保您没有对静态Mapper.Map方法的任何调用,并且如果您使用ProjectTo或UseAsDataSource扩展方法,请确保传入适当的IConfigurationProvider实例。\ r \ n在AutoMapper.Mapper.get_Instance ()\ r \ n在AutoMapper.Mapper.Map(对象源,对象目标,类型sourceType,类型destinationType)\ r \ n在GoalPear.Web.Areas.PM.Controllers.CompanyController.SaveData(CompanyFormViewModel companyFormViewModel)
请告诉我为什么我会收到这个错误,因为我无法在这么多努力之后搞清楚。
这是我的控制器代码
public CompanyController() { } private readonly ICompanyService _companyService; public CompanyController(ICompanyService companyService) { _companyService = companyService; }
这是控制器中的SaveData方法
[HttpPost] public JsonResult SaveData(CompanyFormViewModel companyFormViewModel) { try { int? id = null; Company company; if (companyFormViewModel.Id == null) { company = new Company(); } else { id = (int)companyFormViewModel.Id; company = _companyService.GetCompany((int)id); } company = (Company)Mapper.Map( companyFormViewModel, company, typeof(CompanyFormViewModel), typeof(Company)); CompanyValidator companyValidator = new CompanyValidator(); ValidationResult validationResult = companyValidator.Validate(company); if (validationResult.IsValid) //check for any validation errors { if (id == null) { _companyService.CreateCompany(company); } else { _companyService.Update(company); } _companyService.SaveCompany(); return new JsonSuccessResult(); } else { Response.StatusCode = (int)ResponseCode.UnprocessableEntity; return new JsonErrorResult(validationResult); } } catch (Exception ex) { Response.StatusCode = (int)ResponseCode.UnprocessableEntity; return new JsonErrorResult(ex.ToString()); } }
我的表单视图代码
@using (Html.BeginForm("SaveData", "Company", FormMethod.Post, new { @class = "", @id = "validate", @role = "form" })) { @*
这是我的公司型号代码
public string Name {get;set;} public string Logo { get; set; } public string Address { get; set; } public string Owner { get; set; } public int Size { get; set; } public string Email { get; set; } public int Phone { get; set; } public int FaxNo { get; set; } public string Password { get; set; } public string Country { get; set; } public string State { get; set; }
这是ViewModel代码
public CompanyFormViewModel() { } public int? Id { get; set; } [DisplayName(" Company Name")] public string Name { get; set; } [DisplayName("Owner")] public string Owner { get; set; } [DisplayName("Email")] public string Email { get; set; } [DisplayName("Password")] public string Password { get; set; } [DisplayName("Address")] public string Address { get; set; }
这是DomainToViewModelMapping配置文件
cfg.CreateMap() .ForMember(vm => vm.Id, map => map.MapFrom(m => m.Id)) .ForMember(vm => vm.Name, map => map.MapFrom(m => m.Name)) .ForMember(vm => vm.Owner, map => map.MapFrom(m => m.Owner)) .ForMember(vm => vm.Email, map => map.MapFrom(m => m.Email)) .ForMember(vm => vm.Password, map => map.MapFrom(m => m.Password)) .ForMember(vm => vm.Address, map => map.MapFrom(m => m.Address));
我的viewModeltoDomainMapping配置文件
cfg.CreateMap() .ForMember(m => m.Id, map => map.MapFrom(vm => vm.Id)) .ForMember(m => m.Name, map => map.MapFrom(vm => vm.Name)) .ForMember(m => m.Owner, map => map.MapFrom(vm => vm.Owner)) .ForMember(m => m.Email, map => map.MapFrom(vm => vm.Email)) .ForMember(m => m.Password, map => map.MapFrom(vm => vm.Password)) .ForMember(m => m.Address, map => map.MapFrom(vm => vm.Address));
为什么我的mapper错误未初始化?
无法看到初始化映射的位置。
解:
您可以创建映射配置文件,例如:
public class MappingProfile : Profile { public MappingProfile() { CreateMap() .ForMember(vm => vm.Id, map => map.MapFrom(m => m.Id)) .ForMember(vm => vm.Name, map => map.MapFrom(m => m.Name)) .ForMember(vm => vm.Owner, map => map.MapFrom(m => m.Owner)) .ForMember(vm => vm.Email, map => map.MapFrom(m => m.Email)) .ForMember(vm => vm.Password, map => map.MapFrom(m => m.Password)) .ForMember(vm => vm.Address, map => map.MapFrom(m => m.Address)); CreateMap() .ForMember(m => m.Id, map => map.MapFrom(vm => vm.Id)) .ForMember(m => m.Name, map => map.MapFrom(vm => vm.Name)) .ForMember(m => m.Owner, map => map.MapFrom(vm => vm.Owner)) .ForMember(m => m.Email, map => map.MapFrom(vm => vm.Email)) .ForMember(m => m.Password, map => map.MapFrom(vm => vm.Password)) .ForMember(m => m.Address, map => map.MapFrom(vm => vm.Address)); } }
然后在Global.asax.cs
中的映射配置文件中初始化
public class AutoMapperConfiguration { public static void Configure() { Mapper.Initialize(x => { x.AddProfile(); }); Mapper.Configuration.AssertConfigurationIsValid(); } }
最后 ,不要忘记在Application_Start()
配置自动映射器
//Configure Automapper AutoMapperConfiguration.Configure();
您需要使用通过配置创建的映射器实例,而不是使用静态Mapper.Map
方法,如下所示:
var mapper = cfg.CreateMapper(); var company = (Company)mapper.Map(companyFormViewModel, company, typeof(CompanyFormViewModel), typeof(Company));
在最新版本中使用mapper的首选方法是通过IMapper
接口。 如果您也使用DI容器,您可以绑定/注册IMapper
以通过config.CreateMapper()
方法重载解析实例, config.CreateMapper()
方法采用实例工厂委托(即容器的实例工厂方法)。 如果您不使用DI容器,则可以创建例如MapperFactory
类,该类将负责映射器实例的创建及其配置。
例:
var config = new MapperConfiguration(cfg => { //cfg.CreateMap()... //cfg.AddProfile()... etc... }); var mapper = config.CreateMapper();