[英]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");
}
我不会在我的存储库中显示GetEventByIdAsync
和GetUserByIdAsync
方法,因为这部分代码可以正常工作,我只是想提供一些上下文。 我在添加上面的UserEvent
时运行了调试器,并且正确的Event
和AppUser
被添加到上面的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; }
}
这里的Organisers
是MemberDto
类型。 这是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 并且UserName
是null
。
抱歉,我知道这是一篇很长的帖子,但我不确定这个过程的哪一部分出了问题。 我希望 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.