簡體   English   中英

通過聯接自動映射多對多地圖字段

[英]Automapper many to many map fields from join

我正在使用Asp.net核心,EF核心和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; }
}

自動映射器配置文件:

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

這將導致以下輸出(至少我獲得了用戶信息),但我無法弄清楚如何從EventAttendee中將'DateJoined'屬性獲取到返回的Attendees集合中,並且僅獲得默認日期,如下所示:

{
    "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屬性?

謝謝,詹姆斯

首先,您不需要這兩行:

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集合,因此您只需要為此設置映射。 在其中,您可以簡單地使用導航屬性來訪問相關實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM