【问题标题】:Complex objects mapping and Nested mappings复杂对象映射和嵌套映射
【发布时间】:2015-07-10 10:01:03
【问题描述】:

好的,我很难从模型转换为 dto 模型,反之亦然 模型是有效的,但是当试图映射“AutoMapper.dll 中发生 AutoMapper.AutoMapperMappingException”时

这里是模型类

public class Category
    {
        public Guid CategoryId { get; set; }

        public string CategoryName { get; set; }

        public virtual ICollection<Post> Posts { get; set; }
    }


public class Post
    {
        public Guid PostId { get; set; }

        public string PostTitle { get; set; }

        public string PostMessage { get; set; }

        public string PostImage { get; set; }

        public virtual ICollection<Tag> Tags { get; set; }

        public Guid Category_Id { get; set; }

        [ForeignKey("Category_Id")]
        public virtual Category Category { get; set; }

        public virtual IdentityUser User { get; set; }

    }

 public class Tag
    {
        public Guid TagId { get; set; }

        public string TagName { get; set; }

        public virtual List<Post> Posts { get; set; }
    }

这是我的 DTO

public class TagDto
    {
        public Guid TagId { get; set; }

        public string TagName { get; set; }

        public virtual IList<PostDto> Posts { get; set; }
    }

 public class PostDto
    {
        public Guid PostId { get; set; }


        public string PostTitle { get; set; }


        public string PostMessage { get; set; }

        public string PostImage { get; set; }

        public virtual ICollection<TagDto> Tags { get; set; }

        [Required]
        public Guid Category_Id { get; set; }

        public virtual CategoryDto Category { get; set; }

        public virtual IdentityUser User { get; set; }
    }

这是我一直在尝试使用自动映射器在实体之间进行映射

public static Tag Tag_ToModel(this TagDto dto)
        {
            AutoMapper.Mapper.CreateMap<TagDto, Tag>()
                .ForMember(post => post.Posts, expr => expr.MapFrom(src => src.Posts))
                .ConstructUsing(post => AutoMapper.Mapper.Map<Tag>(post.Posts));
            var model = AutoMapper.Mapper.Map<Tag>(dto);
            return model;
        }

        public static TagDto Tag_ToDto(this Tag model)
        {
            AutoMapper.Mapper.CreateMap<Tag, TagDto>()
                .ForMember(post => post.Posts, expr => expr.MapFrom(src => src.Posts))
                .ConstructUsing(post => AutoMapper.Mapper.Map<TagDto>(post.Posts));
            var dto = AutoMapper.Mapper.Map<TagDto>(model);
            return dto;
        }

public static Post Post_ToModel(this PostDto dto)
        {
            AutoMapper.Mapper.CreateMap<PostDto, Post>()
                .ForMember(prop => prop.Comments, expr => expr.MapFrom(src => src.Comments))
                .ForMember(prop => prop.Tags, expr => expr.MapFrom(src => src.Tags))
                .ConstructUsing(category => AutoMapper.Mapper.Map<Post>(category.Category))
                .ConstructUsing(tag=>AutoMapper.Mapper.Map<Post>(tag.Tags));
            var model = AutoMapper.Mapper.Map<Post>(dto);
            return model;
        }

        public static PostDto Post_ToDto(this Post model)
        {
            AutoMapper.Mapper.CreateMap<Post, PostDto>()
                .ForMember(prop => prop.Comments, expr => expr.MapFrom(src => src.Comments))
                .ForMember(prop => prop.Tags, expr => expr.MapFrom(src => src.Tags)
                .ConstructUsing(category => AutoMapper.Mapper.Map<PostDto>(category.Category))
                .ConstructUsing(tag => AutoMapper.Mapper.Map<PostDto>(tag.Tags));
            var dto = AutoMapper.Mapper.Map<PostDto>(model);
            return dto;
        }

public static Category Category_ToModel(this CategoryDto dto)
        {
            AutoMapper.Mapper.CreateMap<CategoryDto, Category>()
                .ForMember(post => post.Posts, expr => expr.MapFrom(src => src.Posts));
            var model = AutoMapper.Mapper.Map<Category>(dto);
            return model;
        }
        public static CategoryDto Category_ToModel(this Category model)
        {
            AutoMapper.Mapper.CreateMap<Category, CategoryDto>()
                .ForMember(post => post.Posts, expr => expr.MapFrom(src => src.Posts));
            var dto = AutoMapper.Mapper.Map<CategoryDto>(model);
            return dto;
        }

我完全没有想法,也找不到任何关于如何映射这种类型的好教程。 我认为,例如在我的类别中,“帖子”没有按应有的方式映射, “帖子”还有一些其他导航道具,例如 IdentityUser、Tag、Comment 和 Category 所有这些实体也都有导航道具。 这种配置是我的最终配置,但我一直在尝试其他配置,唯一有效的是 当我将 Ignore() 用于成员时,但这意味着不会映射这些道具。 是否有遇到此类问题并愿意提供帮助的 automapper 用户? 谢谢

【问题讨论】:

  • 请发布错误堆栈跟踪。 Automapper 还有一个验证器功能,您可以运行它来测试您的映射是否正确。确保更正所有警告和错误。
  • 异常快照 {"缺少类型映射配置或不支持的映射。\r\n\r\n映射类型:\r\nPost -> PostDto\r\nModel.Modeles.Post -> ModelDto.DTO .PostDto\r\n\r\n目标路径:\r\nCategoryDto.Posts.Posts.Posts0[0]\r\n\r\n源值:\r\nModel.Modeles.Post"} 异常:抛出:"缺少类型映射配置或不支持的映射。” (AutoMapper.AutoMapperMappingException) 一个 AutoMapper。抛出 AutoMapperMappingException:“缺少类型映射配置或不支持的映射。”抱歉重播晚了,希望对您有所帮助

标签: c# .net asp.net-mvc automapper dto


【解决方案1】:

您应该在应用启动时调用 createMap,从 global.asax.cs 或类似的东西开始。在尝试执行任何地图操作之前,一次设置所有映射。您需要设置所有映射,以便它可以映射子属性,然后您就不必为 Posts 之类的东西调用 ForMember。

哦,摆脱构造使用。只需使用 Mapper.Map。

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 2013-08-01
    • 2020-09-27
    • 2017-07-20
    • 2018-03-17
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多