首页 > 解决方案 > 在多对多关系中添加实体时所有值都设置为 null

问题描述

我正在创建一个事件应用程序。一个活动可以有多个组织者,一个组织者可以有多个活动。我希望用户能够将组织者添加到现有活动中。这是设置实体的方式。

这是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 ICollection<UserEvents> Organisers { 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; }
}

这就是我配置关系的方式:

builder.Entity<UserEvents>()
    .HasKey(key => new {key.OrganiserId, key.EventId});
    
    builder.Entity<UserEvents>()
        .HasOne(e => e.Organiser)
        .WithMany(e => e.OrganisedEvents)
        .HasForeignKey(e => e.OrganiserId)
        .OnDelete(DeleteBehavior.Cascade);

    builder.Entity<UserEvents>()
        .HasOne(e => e.Event)
        .WithMany(e => e.Organisers)
        .HasForeignKey(e => e.EventId)
        .OnDelete(DeleteBehavior.Cascade);

这是我在 API 中创建的终点:

[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
    };

    // ALL THE VALUES ABOVE ARE CORRECTLY ASSIGNED

    existingEvent.Organisers = existingEvent.Organisers ?? new List<UserEvents>();
    existingEvent.Organisers.Add(userEvent);

    if(await _eventsRepository.SaveAllAsync())
        return Ok();

    return BadRequest("Failed to add organiser");
}

事件 ID 和组织者 ID 已正确添加到UserEvents连接表中,我遇到的问题是组织者属性在Event实体中显示为 null。查看从 Postman 获取的组织者阵列的图像:

在此处输入图像描述

这是我查询Event实体的代码:

[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();
  }

这是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; }           
    }
}

这里的 Organizers 从 映射AppUserMemberDto

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>();
}

标签: asp.netentity-framework

解决方案


推荐阅读