【问题标题】:I'm trying to map a collection from my domain object to a dto object using an automapper, but I fail我正在尝试使用自动映射器将域对象中的集合映射到 dto 对象,但我失败了
【发布时间】:2020-07-02 12:56:43
【问题描述】:

域对象

namespace Blog.Domain
{
    public class Category : BaseEntity
    {
        public string Name { get; set; }

        public virtual ICollection<Post> Posts { get; set; } = new HashSet<Post>();
    }
}

Dto 对象

namespace Blog.Application.DataTransfer
{
    public class CategoryDto
    {
        public int Id { get; set; }
        public string Name { get; set; }

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

个人资料

namespace Blog.Api.Core.Profiles
{
    public class CategoryProfile : Profile
    {
        public CategoryProfile()
        {
            CreateMap<Category, CategoryDto>();
            CreateMap<CategoryDto, Category>();
        }
    }
}

在该类别中,我获取了有关该类别和属于该类别的帖子的信息,但映射不起作用。如何解决?我需要 .ForMember 来映射集合吗?

public class EfGetOneCategoryQuery : IGetOneCategoryQuery
{
    private readonly BlogContext _context;
    private readonly IMapper _mapper;

    public EfGetOneCategoryQuery(BlogContext context, IMapper mapper)
    {
        _context = context;
        _mapper = mapper;
    }

    public CategoryDto Execute(int search)
    {
        var category = _context.Categories.Include(x => x.Posts).Where(x => x.Id == search).FirstOrDefault();

        if (category == null)
        {
            throw new EntityNotFoundException(search, typeof(CategoryDto));
        }

        var response = _mapper.Map<CategoryDto>(category);

        return response;
    }
}

【问题讨论】:

  • 你好。欢迎来到堆栈溢出。您需要提供有关实际错误的详细信息。我们甚至不确定这是编译错误还是运行时错误。
  • 请分享您的错误代码

标签: c# entity-framework asp.net-core entity-framework-core


【解决方案1】:

您正试图从具有 Id 的对象映射到没有 Id 的对象,因此 Automapper 会感到困惑。您应该在映射中使用opt.Ignore()。 参考automapper project into a larger object

或者您可以将 Id 从 Dto 移动到域对象。 下次,请确保添加您遇到的错误的更多详细信息。

【讨论】:

    【解决方案2】:

    抱歉信息不足。这是我第一次发帖。我解决了这个问题:

    CreateMap<Category, CategoryDto>()
                    .ForMember(d => d.Posts, opt => opt.MapFrom(c => c.Posts.Select(x => new PostDto { Id = x.Id, Title = x.Title, Description = x.Description, CategoryId = x.CategoryId, ImageId = x.ImageId })));
    

    还是谢谢。

    【讨论】:

      【解决方案3】:
      1. 从 Dto 中删除 ID?但是,如果您真的需要它,那么这应该可以:
      CreateMap<Category, CategoryDto>( )
              .ForMember(x => x.Id, m => m.Ignore())
      

      第二个选项:

      public class CategoryDto
      {
          [IgnoreMap]
          public int Id { get; set; }
      
          public string Name { get; set; }
      
          public virtual ICollection<Post> Posts { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        相关资源
        最近更新 更多