c# - 查询具有多对多关系的实体返回空值
问题描述
在我的活动应用程序中,一个活动可以有许多组织者,一个组织者可以组织许多活动。这是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
andGetUserByIdAsync
方法,因为这部分代码可以正常工作,我只是想提供一些上下文。我在添加UserEvent
上述内容时运行了调试器,并且正确Event
并被AppUser
添加到上面的Organisers
列表中。
我遇到的问题是在尝试查询数据库并检索事件时,正在检索组织者,但UserName
设置为 Null 并且Id
. 这是GetAllEvents
来自的方法EventsController
:
[HttpGet]
public async Task<ActionResult<IEnumerable<EventDto>>> GetAllEvents()
{
var events = await _eventsRepository.GetEventsAsync();
return Ok(events);
}
这是GetEventsAsync
来自的方法_eventsRepository
:
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
课程:
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>();
}
以下是使用端点时 PostMan 输出的相关部分GetAllEvents
:
如您所见,它正在检索组织者,但Id
's 设置为 0 并且UserName
's 是null
。
抱歉,我知道这是一篇很长的帖子,但我不确定这个过程的哪一部分出了问题。我希望AutoMapper会Organisers
自动将 ' 映射到',但这个映射似乎出现了一些问题。MemberDto
解决方案
我通过在 AutoMapper 中添加一些额外的配置来解决这个问题:
CreateMap<Event, EventDto>()
.ForMember(dest => dest.Organisers, opt => opt.MapFrom(src => src.Organisers.Select(Organisers => Organisers.Organiser)));
推荐阅读
- python - 计算由 scipy 的 Delaunay 函数生成的四面体网格的雅可比行列式
- javascript - Firebase Firestore - 创建快照事件侦听器是否会花费过多的下载?
- r - dplyr 中的条件求和(例如“引用另一行中刚刚更新的值” - 就像在 Excel 中一样)
- python - sklearn.utils 模块未找到
- c# - 在 JsonDeserializer 中正确跳过父级
- python - 在 'r+' 中截断文件使整个文件变成矩形
- google-drive-api - 未经授权的 WebHook 回调通道 Google 推送通知
- python - 从 OSMNX Geoseries 获取坐标列表(纬度、经度)
- pandas - Pandas Groupby:函数定义中的条件语句
- ios - 如何使用带有可选 UIImage 的绑定?