c# – Automapper 6.0.缺少类型映射配置或不支持的映射
我已经看过这个
question,this和
this.
当我从Automapper 3.3.1.0迁移到Automapper 6.0.1.0时,我遇到了这个例外.此代码在Automapper 3.3.1.0中不会引发任何异常. 我有2节课: 第1类:(域名) public class Movie:IEntityBase { public Movie() { Stocks = new List<Stock>(); } public int ID { get; set; } public string Title { get; set; } public string Description { get; set; } public string Image { get; set; } public int GenreId { get; set; } public virtual Genre Genre { get; set; } public string Director { get; set; } public string Writer { get; set; } public string Producer { get; set; } public DateTime ReleaseDate { get; set; } public byte Rating { get; set; } public string TrailerURI { get; set; } public virtual ICollection<Stock> Stocks { get; set; } } 第2类: public class MovieViewModel : IValidatableObject { public int ID { get; set; } public string Title { get; set; } public string Description { get; set; } public string Image { get; set; } public string Genre { get; set; } public int GenreId { get; set; } public string Director { get; set; } public string Writer { get; set; } public string Producer { get; set; } public DateTime ReleaseDate { get; set; } public byte Rating { get; set; } public string TrailerURI { get; set; } public bool IsAvailable { get; set; } public int NumberOfStocks { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var validator = new MovieViewModelValidator(); var result = validator.Validate(this); return result.Errors.Select(item => new ValidationResult(item.ErrorMessage,new[] { item.PropertyName })); } } 我试图在类的构造函数中映射原因Automapper 6.0.1.0没有方法Configure()来覆盖: public class DomainToViewModelMappingProfile : Profile { public override string ProfileName { get { return "DomainToViewModelMappings"; } } public DomainToViewModelMappingProfile() { Mapper.Initialize(cfg => { cfg.CreateMap<Genre,GenreViewModel>() .ForMember(vm => vm.NumberOfMovies,map => map.MapFrom(g => g.Movies.Count())); cfg.CreateMap<Movie,MovieViewModel>() .ForMember(vm => vm.Genre,map => map.MapFrom(m => m.Genre.Name)) .ForMember(vm => vm.GenreId,map => map.MapFrom(m => m.Genre.ID)) .ForMember(vm => vm.IsAvailable,map => map.MapFrom(m => m.Stocks.Any(s => s.IsAvailable))) .ForMember(vm => vm.NumberOfStocks,map => map.MapFrom(m => m.Stocks.Count)) .ForMember(vm => vm.Image,map => map.MapFrom(m => string.IsNullOrEmpty(m.Image) == true ? "unknown.jpg" : m.Image)); }); Mapper.AssertConfigurationIsValid(); } } 我有以下例外:
我试图通过Ignore()方法找出什么属性是这个异常的原因,但是,我仍然得到上述异常. cfg.CreateMap<Genre,map => map.MapFrom(g => g.Movies.Count())); cfg.CreateMap<Movie,MovieViewModel>() .ForMember(vm => vm.Genre,map => map.Ignore()) .ForMember(vm => vm.GenreId,map => map.Ignore()) .ForMember(vm => vm.IsAvailable,map => map.Ignore()) .ForMember(vm => vm.NumberOfStocks,map => map.Ignore()) .ForMember(vm => vm.Image,map => map.Ignore()); 忘了说我在Global.asax.cs中调用以下方法: AutoMapperConfiguration.Configure(); 你能告诉我我做错了什么吗?任何帮助将不胜感激. 最有趣的一点是,此代码在AutoMapper 3.3.1.0中有效. 更新: 它有效!:)感谢所有你们,伙计们,特别感谢@AndriiLitvinov.工作代码: public class DomainToViewModelMappingProfile : Profile { public override string ProfileName { get { return "DomainToViewModelMappings"; } } public DomainToViewModelMappingProfile() { CreateMap<Genre,map => map.MapFrom(g => g.Movies.Count())); CreateMap<Movie,MovieViewModel>() .ForMember(vm => vm.Genre,map => map.MapFrom(m => m.Genre.Name)) .ForMember(vm => vm.GenreId,map => map.MapFrom(m => m.Genre.ID)) .ForMember(vm => vm.IsAvailable,map => map.MapFrom(m => m.Stocks.Any(s => s.IsAvailable))) .ForMember(vm => vm.NumberOfStocks,map => map.MapFrom(m => m.Stocks.Count)) .ForMember(vm => vm.Image,map => map.MapFrom(m => string.IsNullOrEmpty(m.Image) == true ? "unknown.jpg" : m.Image)); } } 并且只调用一次Initialize(): //Global.asax.cs protected void Application_Start() { var config = GlobalConfiguration.Configuration; AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(config); Bootstrapper.Run(); RouteConfig.RegisterRoutes(RouteTable.Routes); GlobalConfiguration.Configuration.EnsureInitialized(); BundleConfig.RegisterBundles(BundleTable.Bundles); } public class AutoMapperConfiguration { public static void Configure() { Mapper.Initialize(x => { x.AddProfile<DomainToViewModelMappingProfile>(); }); } } public class Bootstrapper { public static void `Run() { //Configure Autofac AutofacWebapiConfig.Initialize(GlobalConfiguration.Configuration); //Configure Automapper AutoMapperConfiguration.Configure(); } } 解决方法
我试图在本地实现这样的映射,这一切都有效.我假设您有许多配置文件都调用Mapper.Initialize,因为我记得它只是在应用程序启动时调用一次,所有配置文件应该调用
CreateMap method:
public class MappingProfile : Profile { public MappingProfile() { CreateMap<Foo,Bar>(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |