Automapper «многие ко многим» с использованием DTO - PullRequest
0 голосов
/ 10 марта 2020

Это моя первая настоящая попытка использования Automapper, и я изо всех сил пытаюсь правильно отобразить отношения многие ко многим, используя DTO.

Вот модели:

public class Camp
{
    [Key]
    public long Id { get; set; }

    [Required]
    [MaxLength( 150 )]
    public string Name { get; set; }

    [Required]
    [MaxLength( 150 )]
    public string Location { get; set; }       

    [Required]
    public DateTime StartDate { get; set; }

    [NotMapped]
    public int CampYear
    {
        get => StartDate.Year;
    }    
    public bool Archived { get; set; }    
    public ICollection<Application> Applications { get; set; }    
    public ICollection<CampStaffPosition> CampStaffPositions { get; set; }
}

public class StaffPosition
{
    [Key]
    public int Id { get; set; }
    public string PositionName { get; set; }    
    public ICollection<CampStaffPosition> CampStaffPositions { get; set; }
}

public class CampStaffPosition
{
    public long CampId { get; set; }    
    public Camp Camp { get; set; }    
    public int StaffPositionId { get; set; }    
    public StaffPosition StaffPosition { get; set; }    
    public short PositionQuantity { get; set; } // Additional Info
}

И DTO, к которым я пытаюсь подключиться:

public class CampDto
{
    public long Id { get; set; }    
    public string Name { get; set; }    
    public string Location { get; set; }    
    public DateTime StartDate { get; set; }    
    public int CampYear { get; }    
    public bool Archived { get; set; }    
    public ICollection<ApplicationDto> Applications { get; set; }    
    public ICollection<StaffPositionDto> Positions { get; set; } // Through CampStaffPositions
}

public class StaffPositionDto
{
    public int Id { get; set; }    
    public string Type { get; set; }    
    public string PositionName { get; set; }    
    public short PositionQuantity { get; set; } // From CampStaffPositions
}

После прочтения нескольких других сообщений SO и попытки чтобы последовать их примеру, я потерпел неудачу. Вот несколько разных попыток сопоставления:

    CreateMap<Camp, CampDto>()
        .ForMember( d => d.Positions, opt => opt.MapFrom( d => d.CampStaffPositions.Select( d => d.StaffPosition ).ToList() ) );

    CreateMap<StaffPosition, CampDto>()
        .ForMember( pr => pr.Positions, opt => opt.MapFrom( cp => cp.PositionName ) );

    CreateMap<StaffPosition, StaffPositionDto>();

    //CreateMap<StaffPosition, StaffPositionDto>()
    //    .ForMember( cr => cr.PositionQuantity, opt => opt.MapFrom( c => c.CampStaffPositions ) );

Это самые последние ошибки, которые я получаю (с закомментированной строкой):

Unable to create a map expression from StaffPosition.CampStaffPositions (System.Collections.Generic.ICollection`1[Server.Models.CampStaffPosition]) to StaffPositionDto.PositionQuantity (System.Int16) 
Mapping types: StaffPosition -> StaffPositionDto Server.Models.StaffPosition -> Shared.Dto.Core.StaffPositionDto 
Type Map configuration: StaffPosition -> StaffPositionDto Server.Models.StaffPosition -> Shared.Dto.Core.StaffPositionDto Destination Member: PositionQuantity

и с закомментированной строкой исключено:

Expression of type 'System.Collections.Generic.List`1[Server.Models.StaffPosition]' cannot be used for parameter of type 'System.Linq.IQueryable`1[Server.Models.StaffPosition]' of method 'System.Linq.IQueryable`1[Shared.Dto.Core.StaffPositionDto] Select[StaffPosition,StaffPositionDto](System.Linq.IQueryable`1[Server.Models.StaffPosition], System.Linq.Expressions.Expression`1[System.Func`2[Server.Models.StaffPosition,Shared.Dto.Core.StaffPositionDto]])'

Как я могу сопоставить «многие ко многим», чтобы включить дополнительное свойство из таблицы объединения без необходимости включать таблицу соединения в мои DTO?

...