加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:38:20 所属栏目:百科 来源:网络整理
导读:我已经看过这个 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 L
我已经看过这个 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();
     }            
  }

我有以下例外:

Missing type map configuration or unsupported mapping.

Mapping types: Movie -> MovieViewModel HomeCinema.Entities.Movie ->
HomeCinema.Web.Models.MovieViewModel

我试图通过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>();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读