我已经看过这个 question , this和 this .
当我从 Automapper 3.3.1.0
移动到 Automapper 6.0.1.0
时,我遇到了这个异常。此代码在 Automapper 3.3.1.0
中没有抛出异常。
我有 2 个类(class):
第 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();
}
}
我有以下异常:
Missing type map configuration or unsupported mapping.
Mapping types: 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());
忘了说我正在 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, 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));
}
}
并仅调用一次 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>();
}
}
关于c# - 自动映射器 6.0。缺少类型映射配置或不支持的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42935440/