Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从联接自动映射多对多映射字段_C#_Asp.net Core_Entity Framework Core_Automapper - Fatal编程技术网

C# 从联接自动映射多对多映射字段

C# 从联接自动映射多对多映射字段,c#,asp.net-core,entity-framework-core,automapper,C#,Asp.net Core,Entity Framework Core,Automapper,我正在使用Asp.net核心、EF核心和Automapper。我有一个多对多(在EF Core中,这是使用联接表所必需的),并且很难将联接表中的附加字段映射到我返回的DTO中的相关集合 这些是我的实体(缩写): 事件实体: public class Event { public int Id { get; set; } public string Title { get; set; } public ICollection<EventAttendee> Attend

我正在使用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; }
}
事件转发至:

public class EventToReturnDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public ICollection<AttendeeDto> Attendees { 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()));
    }    
}
如何创建映射以输出DateJoined属性

谢谢,
James

首先,您不需要这两行:

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

现在,在事件映射中,您正在将
EventAttendee
集合映射到
AttendedTo
集合,因此您只需为此设置映射。在其中,您可以简单地使用导航属性访问相关实体。

首先,您不需要这两行:

CreateMap<AppUser, AttendeeDto>();
CreateMap<EventAttendee, AttendeeDto>();
现在,在事件映射中,您正在将
EventAttendee
集合映射到
AttendedTo
集合,因此您只需为此设置映射。在其中,您可以简单地使用导航属性访问相关实体

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); 
{
    "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"
        }
    ]
},
CreateMap<AppUser, AttendeeDto>();
CreateMap<EventAttendee, AttendeeDto>();
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>();