繁体   English   中英

查询具有多对多关系的实体返回 null 值

[英]Querying Entity with many to many relationship returning null values

在我的活动应用程序中,一个活动可以有许多组织者,一个组织者可以组织许多活动。 这是AppUser实体(这是组织者):

public class AppUser
    {      
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Name { get; set; }
        public DateTime Created { get; set; } = DateTime.Now;
        public DateTime LastActive { get; set; } = DateTime.Now;
        public string Location { get; set; } 
        public string EmailAddress { get; set; }
        public string Occupation { get; set; }
        public UserPhoto Photo { get; set; }
        public byte[] PasswordHash { get; set; } 
        public byte[] PasswordSalt { get; set; } 
        public ICollection<UserLike> LikedByUsers { get; set; }
        public ICollection<UserLike> LikedUsers { get; set; }
        public ICollection<Event> CreatedEvents { get; set; }
        public ICollection<UserEvents> OrganisedEvents { get; set; }
        public ICollection<EventUsers> AttendingEvents { get; set; }
    }

这是Event实体:

public class Event
    {
        public int Id { get; set; }
        public AppUser Creator { get; set; }
        public int CreatorId { get; set; }
        public string Name { get; set; }
        public string MainPhotoUrl { get; set; }
        public DateTime Date { get; set; }
        public string Location { get; set; }
        public ICollection<UserEvents> Organisers { get; set; }
        public ICollection<EventUsers> Attendees { get; set; }
        public ICollection<EventPhoto> Photos { get; set; }
    }

这是我创建的名为UserEvents的连接实体:

public class UserEvents
    {
        public AppUser Organiser { get; set; }
        public int OrganiserId { get; set; }
        public Event Event { get; set; }
        public int EventId { get; set; }
    }

这是我的EventsController中的终点,它将Organiser (英式拼写:)添加到现有事件中:

[HttpPut("add-organiser/{eventId}/{organiserId}")]
    public async Task<ActionResult> addOrganiser(int eventId, int organiserId)    
    {
        var existingEvent = await _eventsRepository.GetEventByIdAsync(eventId);
        var organiser = await _userRepository.GetUserByIdAsync(organiserId);
        var userEvent = new UserEvents {
            OrganiserId = organiserId,
            Organiser = organiser,
            EventId = eventId,
            Event = existingEvent
        };
        existingEvent.Organisers = existingEvent.Organisers ?? new List<UserEvents>();
        existingEvent.Organisers.Add(userEvent);
        if(await _eventsRepository.SaveAllAsync()) return Ok();
        return BadRequest("Failed to add organiser");
    }

我不会在我的存储库中显示GetEventByIdAsyncGetUserByIdAsync方法,因为这部分代码可以正常工作,我只是想提供一些上下文。 我在添加上面的UserEvent时运行了调试器,并且正确的EventAppUser被添加到上面的Organisers列表中。

我遇到的问题是在尝试查询数据库并检索事件时,正在检索组织者,但UserName设置为 Null 和Id 这是EventsController中的GetAllEvents方法:

[HttpGet]
        public async Task<ActionResult<IEnumerable<EventDto>>> GetAllEvents()
        {
            var events = await _eventsRepository.GetEventsAsync();
            return Ok(events);
        }

这是_eventsRepository中的GetEventsAsync方法:

public async Task<IEnumerable<EventDto>> GetEventsAsync()
        {
            return await _context.Events
            .Include(e => e.Creator)
            .Include(e => e.Photos)
            .Include(e => e.Organisers)
            .ThenInclude(e => e.Organiser)
            .ProjectTo<EventDto>(_mapper.ConfigurationProvider)
            .ToListAsync();
        }

正如您在上面看到的, Event实体使用自动映射器映射到EventDto 这是EventDto

public class EventDto
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public string Location { get; set; }
        public string MainPhotoUrl { get; set; }
        public ICollection<PhotoDto> Photos { get; set; }
        public MemberDto Creator { get; set; }
        public ICollection<MemberDto> Organisers { get; set; }
        public ICollection<MemberDto> Attendees { get; set; }        
    }

这里的OrganisersMemberDto类型。 这是MemberDto的 MemberD:

public class MemberDto
        {
            public int Id { get; set; }
            public string UserName { get; set; }
            public string PhotoUrl { get; set; }
            public string Name { get; set; }
            public DateTime Created { get; set; } = DateTime.Now;
            public DateTime LastActive { get; set; } = DateTime.Now;
            public string Location { get; set; } 
            public string EmailAddress { get; set; }
            public string Occupation { get; set; }
            public PhotoDto Photo { get; set; }

        }

这是我的 AutoMapper 配置的相关部分:

public AutoMapperProfile() {
     CreateMap<AppUser, MemberDto>();
     CreateMap<Event, EventDto>();
}

以下是使用GetAllEvents端点时来自 PostMan 的 output 的相关部分:

在此处输入图像描述

如您所见,它正在检索组织者,但Id设置为 0 并且UserNamenull

抱歉,我知道这是一篇很长的帖子,但我不确定这个过程的哪一部分出了问题。 我希望 AutoMapper 会自动将Organisers映射到MemberDto ,但这种映射似乎出现了一些问题。

我通过在 AutoMapper 中添加一些额外的配置来解决这个问题:

CreateMap<Event, EventDto>()
            .ForMember(dest => dest.Organisers, opt => opt.MapFrom(src => src.Organisers.Select(Organisers => Organisers.Organiser)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM