复杂对象映射和嵌套映射

本文关键字:映射 嵌套 复杂 对象 | 更新日期: 2023-09-27 18:01:57

好的,我有一个非常困难的时间从一个模型转换到dto模型,反之亦然模型是有效的,但是当尝试映射"AutoMapper"时。AutoMapperMappingException' occurred in AutoMapper.dll"

这里是Model类

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; }
    }

和这里是我一直在尝试使用automapper实体之间的映射

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;
        }

我已经没有主意了,也没有找到任何关于如何绘制这种地图的好教程。我认为,在我的分类中,"邮报"没有像它应该的那样映射,"Post"仍然有一些其他导航道具,如IdentityUser, Tag, Comment和Category所有这些实体都有导航道具。这种配置是我的最后一次,但我一直在尝试其他的,它唯一有效的时间是当我使用Ignore() for成员时,但这意味着这些道具将不会被映射。是否有自动变速器用户遇到这种问题并愿意提供帮助?谢谢你

复杂对象映射和嵌套映射

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

哦,去掉Using这个结构。使用Mapper.Map.