EF Core 8:如何为反序列化列表分配已有实体引用
EF Core保存关联实体时EventId未知的问题
我正在使用ASP.NET Core 8和EF Core 8构建Blazor Wasm Web应用,保存关联实体时触发了如下错误,寻求解决方法。
实体模型配置
public class EventRole { // 复合主键 public long EventId { get; set; } public string Name { get; set; } // 反向引用 [ForeignKey(nameof(EventId))] public Event? Event { get; set; } } public class EventParticipant { // 复合主键 public long EventId { get; set; } public long UserId { get; set; } // 关联内容 public ICollection<EventRole> Roles { get; set; } = new HashSet<EventRole>(); [ForeignKey(nameof(EventId))] public Event? Event { get; set; } [ForeignKey(nameof(UserId))] public User? User { get; set; } } public class Event { public long Id { get; set; } public ICollection<EventParticipant> Participants { get; set; } = new HashSet<EventParticipant>(); public ICollection<EventRole> Roles { get; set; } = new HashSet<EventRole>(); }
DbContext模型构建配置
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置复合主键 modelBuilder.Entity<EventParticipant>() .HasKey(p => new { p.EventId, p.UserId }); modelBuilder.Entity<EventRole>() .HasKey(r => new { r.EventId, r.Name }); // 注释掉的中间实体配置 // modelBuilder.Entity<EventParticipantRole>().HasKey(pr => new { pr.EventId, pr.UserId, pr.RoleName }); // 配置导航属性自动加载 modelBuilder.Entity<Event>() .Navigation(e => e.Participants).AutoInclude(); modelBuilder.Entity<Event>() .Navigation(e => e.Roles).AutoInclude(); modelBuilder.Entity<EventParticipant>() .Navigation(p => p.User).AutoInclude(); modelBuilder.Entity<EventParticipant>() .Navigation(p => p.Roles).AutoInclude(); }
Blazor客户端提交代码
Event ev = new Event(); EventParticipant participant = new EventParticipant() { User = user }; EventRole role = new EventRole { Name = "Organisation" }; EventRole role2 = new EventRole { Name = "BudgetControl" }; participant.Roles.Add(role); participant.Roles.Add(role2); ev.Roles.Add(role); ev.Roles.Add(role2); ev.Participants.Add(participant); await Http.PostAsJsonAsync<Event>("api/Events", ev);
API控制器的保存方法
_context.Events.Add(@event); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetEvent), new { id = @event.Id }, @event);
触发的错误信息
System.InvalidOperationException: The value of 'EventRole.EventId' is unknown when attempting to save changes. This is because the property is also part of a foreign key for which the principal entity in the relationship is not known.
问题分析与疑问
我判断错误根源是JSON反序列化:客户端提交时同一个EventRole实例同时被添加到Event.Roles和EventParticipant.Roles,但反序列化后EF Core无法识别这两处的角色是同一实体,导致EventId无法被正确赋值。
请问如何让EF Core识别这些反序列化后的角色是事件中已有的实体,从而为其分配相同的实体引用(及对应的EventId)?是否需要修改当前的数据模型?注:当前使用内存数据库进行测试。
内容的提问来源于stack exchange,提问作者Apahdos
相关产品推荐
相关产品推荐

