Automapper много ко многим полям карты от соединения - PullRequest
0 голосов
/ 04 октября 2018

Я использую ядро ​​Asp.net, EF Core и Automapper.У меня есть много ко многим (вроде как в EF Core необходимо использовать для этого таблицу соединения), и у меня возникают проблемы с отображением дополнительного поля в таблице соединения в связанную коллекцию внутри DTO, которое я возвращаю.

Это мои сущности (сокращенно):

Сущность события:

public class Event
{
   public int Id { get; set; }
   public string Title { get; set; }
   public ICollection<EventAttendee> Attendees { get; set; }
}

Сущность AppUser:

public class AppUser : IdentityUser<int>
{
    public string PhotoUrl { get; set; }
    public ICollection<EventAttendee> AttendingEvents { get; set; }
}

Сущность EventAttendee:

public class EventAttendee
{
    public int AppUserId { get; set; }
    public AppUser AppUser { get; set; }
    public int EventId { get; set; }
    public Event Event { get; set; }
    public DateTime DateJoined { get; set; }
}

EventToReturnDto:

public class EventToReturnDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public ICollection<AttendeeDto> Attendees { get; set; }
}

AttendeeDto:

public class AttendeeDto
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public DateTime DateJoined { get; set; }
}

Профиль Automapper:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<AppUser, AttendeeDto>();
        CreateMap<EventAttendee, AttendeeDto>();
        CreateMap<Event, EventToReturnDto>()
            .ForMember(dest => dest.Attendees,
                opt => opt.MapFrom(x => x.Attendees.Select(y => y.AppUser).ToList()));
    }    
}

Запрос:

var events = await _context.Events
    .Include(a => a.Attendees).ThenInclude(x => x.AppUser)
    .OrderBy(e => e.Date)
    .AsNoTracking()
    .ToListAsync(cancellationToken);

var eventsToReturn = _mapper.Map<List<EventToReturnDto>>(events); 

Это приводит кследующий вывод (я, по крайней мере, получаю информацию о пользователе), но я не могу понять, как получить свойство DateJoined из EventAttendee в коллекцию возвращенных посетителей и просто получить дату по умолчанию следующим образом:

{
    "id": 2,
    "title": "Event 2",
    "attendees": [
        {
            "id": 4,
            "userName": "Dave",
            "dateJoined": "0001-01-01T00:00:00"
        },
        {
            "id": 3,
            "userName": "Jane",
            "dateJoined": "0001-01-01T00:00:00"
        }
    ]
},

Как мне создать отображение для вывода свойства DateJoined?

Спасибо, Джеймс

1 Ответ

0 голосов
/ 04 октября 2018

Прежде всего, вам не нужны обе эти строки:

CreateMap<AppUser, AttendeeDto>();
CreateMap<EventAttendee, AttendeeDto>();

Из-за ваших инструкций по отображению события вы фактически просто отображаете AppUser, но пропускаете EventAttendeeполностью.По этой же причине вы не можете получить свойство DateJoined.

Вместо этого вам следует сопоставить событие только с событием DTO, а затем создать собственное сопоставление для EventAttendee:

CreateMap<EventAttendee, AttendeeDto>()
   .ForMember(d => d.Id, o => o.MapFrom(s => s.AppUserId))
   .ForMember(d => d.UserName, o => o.MapFrom(s => s.AppUser.UserName))
   .ForMember(d => d.DateJoined, o => o.MapFrom(s => s.DateJoined));
CreateMap<Event, EventToReturnDto>();

Итак, теперь внутри отображения событий вы отображаете коллекцию EventAttendee в коллекцию AttendeeDto, поэтому вам просто нужно настроить отображение для этого.И внутри этого вы можете просто использовать свойства навигации для доступа к связанным сущностям.

...