繁体   English   中英

复杂对象映射和嵌套映射

[英]Complex objects mapping and Nested mappings

好的,我很难从模型转换为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()时,但这意味着将不会映射thos道具。 有任何此类问题并且愿意帮助的automapper用户吗? 谢谢

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM