使用 AutoMapper 映射 ICollection

Map ICollection With AutoMapper

大家好,我在使用 AutoMapper 映射某些模型时遇到了很多问题,我想知道您是否可以指出正确的方向。

我有一些实体如下;

      public class Camp
  {
    public int CampId { get; set; }
    public string Name { get; set; }
    public string Moniker { get; set; }
    public Location Location  { get; set; }
    public DateTime EventDate { get; set; } = DateTime.MinValue;
    public int Length { get; set; } = 1;
    public ICollection<Talk> Talks { get; set; }
  }



 public class Talk
  {
    public int TalkId { get; set; }
    public Camp Camp { get; set; }
    public string Title { get; set; }
    public string Abstract { get; set; }
    public int Level { get; set; }
    public Speaker Speaker { get; set; }
  }

以及对应的DTO的

   public class CampModel
    {

        public string Name { get; set; }
        public string Moniker { get; set; }
        public DateTime EventDate { get; set; } = DateTime.MinValue;
        public int Length { get; set; } = 1;

        public string Venue { get; set; }
        public string LocationAddress1 { get; set; }
        public string LocationAddress2 { get; set; }
        public string LocationAddress3 { get; set; }
        public string LocationCityTown { get; set; }
        public string LocationStateProvince { get; set; }
        public string LocationPostalCode { get; set; }
        public string LocationCountry { get; set; }
        public ICollection<TalkModel> Talks { get; set; }

    }


 public class TalkModel
    {
        public int TalkId { get; set; }
        public string Title { get; set; }
        public string Abstract { get; set; }
        public int Level { get; set; }
    }

我想在我的控制器上使用 automapper,如下所示:

 [Route("api/[controller]")]
    public class CampsController : ControllerBase
    {
        private readonly ICampRepository _repository;
        private readonly IMapper _mapper;

        public CampsController(ICampRepository repository, IMapper mapper)
        {
            _repository = repository;
            _mapper = mapper;
        }
      

        [HttpGet]
        public async Task<ActionResult<CampModel[]>> Get(bool includeTalks = false)
        {
            try
            {
                var camps = await _repository.GetAllCampsAsync(includeTalks);

                var mapper = _mapper.Map<CampModel[]>(camps);


                return mapper;
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, "Database failure" + " Message: " + e);
            }
        }
}

我将像这样返回我存储库中的营地:

  public async Task<Camp[]> GetAllCampsByEventDate(DateTime dateTime, bool includeTalks = false)
    {
      _logger.LogInformation($"Getting all Camps");

      IQueryable<Camp> query = _context.Camps
          .Include(c => c.Location);

      if (includeTalks)
      {
        query = query
          .Include(c => c.Talks)
          .ThenInclude(t => t.Speaker);
      }

      // Order It
      query = query.OrderByDescending(c => c.EventDate)
        .Where(c => c.EventDate.Date == dateTime.Date);

      return await query.ToArrayAsync();
    }

我已经在 Startup.Cs

上注册了我的自动映射器
 services.AddAutoMapper(typeof(CampProfile).Assembly);

像这样使用个人资料:

 public class CampProfile : Profile
    {

        public CampProfile()
        {
            this.CreateMap<Camp, CampModel>()
                .ForMember(c => c.Venue, o => o.MapFrom(m => m.Location.VenueName))
                .ForMember(c => c.Talks, o => o.MapFrom(m => m.Talks))
                .ReverseMap();
        }
        
    }

但是当我尝试到达终点时,出现以下错误:

Message: AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types:
Object -> CampModel[]
System.Object -> CoreCodeCamp.Models.CampModel[]
 ---> AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types:
Camp -> CampModel
CoreCodeCamp.Data.Camp -> CoreCodeCamp.Models.CampModel

Type Map configuration:
Camp -> CampModel
CoreCodeCamp.Data.Camp -> CoreCodeCamp.Models.CampModel

Destination Member:
Talks

 ---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types:
Talk -> TalkModel
CoreCodeCamp.Data.Talk -> CoreCodeCamp.Models.TalkModel

我做错了什么?我认为问题与 public ICollection<Talk> Talks { get; set; } 属性 有关。提前致谢

根据您上面给出的代码,您需要配置 TalkTalkModel 之间的映射,请在 AutoMapper 中查看 Nested Mappings

只需在 TalkTalkModel 之间添加映射器,如下所示:

public class CampProfile : Profile
{

    public CampProfile()
    {
        this.CreateMap<Talk, TalkModel>();
        this.CreateMap<Camp, CampModel>()
            .ForMember(c => c.Venue, o => o.MapFrom(m => m.Location.VenueName))
            //.ForMember(c => c.Talks, o => o.MapFrom(m => m.Talks))
            .ReverseMap();
    }

}