Automapper 6.0.缺少类型映射配置或不支持的映射

Ste*_*pUp 3 c# asp.net asp.net-mvc automapper asp.net-web-api

我已经看过这个问题,这个和这个.

当我从移动我有此异常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; }
}
Run Code Online (Sandbox Code Playgroud)

第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 }));
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图在类的构造函数中映射因为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();
     }            
  }
Run Code Online (Sandbox Code Playgroud)

我有以下例外:

缺少类型映射配置或不支持的映射.

映射类型:电影 - > 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());
Run Code Online (Sandbox Code Playgroud)

忘了说我在调用以下方法Global.asax.cs:

AutoMapperConfiguration.Configure();
Run Code Online (Sandbox Code Playgroud)

你能告诉我我做错了什么吗?任何帮助将不胜感激.

这段代码最有意义的一点是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));
     }
}
Run Code Online (Sandbox Code Playgroud)

并且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();
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*nov 6

我试图在本地实现这样的映射,这一切都有效.我假设您有许多配置文件,Mapper.Initialize只要我记得它只是在应用程序启动时调用一次,并且所有配置文件都应该调用CreateMap方法:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Foo, Bar>();
    }
}
Run Code Online (Sandbox Code Playgroud)