c# - 自动映射器 6.0。缺少类型映射配置或不支持的映射

标签 c# asp.net asp.net-mvc asp.net-web-api automapper

我已经看过这个 question , thisthis .

当我从 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/

相关文章:

c# - 用最小起订量模拟代表

c# - 在 ASP.NET 中实现存储库和工作单元模式

asp.net - Directory.CreateDirectory 在共享主机上抛出 UnauthorizedAccessException 的可能原因

javascript - 在里面用htmlhelpers动态创建div?

c# - 为什么在 C# 中没有引用计数 + 垃圾收集?

c# - 根据另一个 NumericUpDown 控件更新 NumericUpDown 值

asp.net - 如何嵌入字体

c# mvc textboxfor 用于多个字符串

javascript - 如何从 MVC 中的 Controller 下载由 html2canvas 创建的字节形式的图像(在浏览器中显示保存对话框)?

c# - 如何为类的继承者专门化参数类型?