asp.net - 在多对多关系中添加实体时所有值都设置为 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 从 映射AppUser
到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>();
}
解决方案
推荐阅读
- excel - 在 Excel 中插入一组行
- bootstrap-4 - Bootstrap 4 - 在移动设备上禁用标签功能
- c# - 基于 2 个字段匹配的 Mongodb 查询
- javascript - 如何以简单的方式获取 td 值?
- vue.js - 在 v-for 中调用一个 vue 组件
- azure - Azure Functions 2.0 中的 Hosts.json 似乎不尊重队列属性
- pandas - 如何在使用 SPARK ML 计算的特征上应用 Sklearn SVM 实现(Spark ML 中不存在多类 SVM)
- python - 如何在多种条件下过滤字符串 python pandas
- kendo-ui - KendoReportViewer JS 升级问题
- python-3.x - 以下这些作业有什么区别?