【发布时间】:2021-03-25 15:58:44
【问题描述】:
在我的活动应用程序中,一个活动可以有多个组织者,一个组织者可以组织多个活动。这是AppUser Entity(这是组织者):
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; }
}
这是EventEntity:
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 类:
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 输出的相关部分:
如您所见,它正在检索组织者,但 Id 设置为 0,UserName 设置为 null。
抱歉,我知道这是一篇很长的帖子,但我不确定这个过程的哪一部分出了问题。我希望 Organisers 会被 AutoMapper 自动映射到 MemberDto,但这个映射似乎出现了问题。
【问题讨论】:
标签: c# asp.net entity-framework automapper