【问题标题】:Querying Entity with many to many relationship returning null values查询具有多对多关系的实体返回空值
【发布时间】: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");
    }

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

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

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

这是来自_eventsRepositoryGetEventsAsync 方法:

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 类:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-03
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      相关资源
      最近更新 更多