C# Automapper 6.0。缺少类型映射配置或不支持的映射
我已经看过了,还有 当我从C# Automapper 6.0。缺少类型映射配置或不支持的映射,c#,asp.net,asp.net-mvc,asp.net-web-api,automapper,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Automapper,我已经看过了,还有 当我从automapper3.3.1.0移动到automapper6.0.1.0时,出现了这个异常。此代码在Automapper 3.3.1.0中不会引发异常 我有两门课: 第1类:(领域) 我有以下例外: 缺少类型映射配置或不支持的映射 映射类型:Movie->MovieViewModel HomeCinema.Entities.Movie-> HomeCinema.Web.Models.MovieViewModel 我试图通过Ignore()方法找出什么属性是这个异常的原
automapper3.3.1.0
移动到automapper6.0.1.0
时,出现了这个异常。此代码在Automapper 3.3.1.0
中不会引发异常
我有两门课:
第1类:(领域)
我有以下例外:
缺少类型映射配置或不支持的映射
映射类型:Movie->MovieViewModel HomeCinema.Entities.Movie->
HomeCinema.Web.Models.MovieViewModel
我试图通过Ignore()
方法找出什么属性是这个异常的原因,但是,我仍然得到了上面的异常
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.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());
你能告诉我我做错了什么吗?任何帮助都将不胜感激
最有趣的一点是,此代码在
AutoMapper 3.3.1.0
中有效
更新:
它起作用了!:)感谢你们,伙计们,特别感谢@Andrivilitvinov。工作守则:
public class DomainToViewModelMappingProfile : Profile
{
public override string ProfileName
{
get { return "DomainToViewModelMappings"; }
}
public DomainToViewModelMappingProfile()
{
CreateMap<Genre, GenreViewModel>()
.ForMember(vm => vm.NumberOfMovies, 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));
}
}
当您调用
Mapper.assertconfigurationsvalid()时代码>方法必须确保每个属性都有要映射的有效源和目标。如果没有每个属性的有效源和目标,则会出现错误。如果您查看错误消息,事实上它会告诉您详细信息。我只是浏览了一下您的代码,但例如,public virtual ICollection Stocks{get;set;}
没有映射。我尝试在本地实现这种映射,并且都成功了。我假设您有许多配置文件,所有这些配置文件都调用Mapper.Initialize
,据我所知,这意味着在应用程序启动时只调用一次,所有配置文件都应调用:
公共类映射配置文件:配置文件
{
公共映射配置文件()
{
CreateMap();
}
}
此代码在AutoMapper 3.3.1.0
中有效,无需映射Stocks
@steppup我很高兴您解决了问题。从版本3到版本6有了很大的变化。您不应该期望它在每个版本上都能工作。例如,据我所知,您正在使用AutoMapper的静态API,在某个时候(我猜是5.x版),静态API完全被丢弃,并在稍后返回。对不起,但“拥有多个配置文件”是什么意思?我只有一个类classdomaintoviewmodelmappingprofile:Profile
。我指的是从Profile
驱动的许多类,它们依次调用Mapper.Initialize
。我重写了代码,只调用了一次这个方法Initialize()
。请参阅我的更新部分。在Mapper.Initialize
之前调用Mapper.assertconfigurationsvalid
时,我会遇到相同的异常。确保你把事情按正确的顺序进行。不客气,我很高兴这有帮助。我在升级到v5时遇到了类似的问题。您最初出现问题的原因是在第一次调用初始化时没有注册映射,第二次调用没有产生任何效果。第二个问题是在您尝试验证配置之前根本没有调用Initialize。我希望这是有道理的。
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();
}
}
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.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());
AutoMapperConfiguration.Configure();
public class DomainToViewModelMappingProfile : Profile
{
public override string ProfileName
{
get { return "DomainToViewModelMappings"; }
}
public DomainToViewModelMappingProfile()
{
CreateMap<Genre, GenreViewModel>()
.ForMember(vm => vm.NumberOfMovies, 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));
}
}
//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();
}
}
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Foo, Bar>();
}
}