EF Core添加Vergadering时误新增Bestuurslid,如何正确维护关联?
问题解决方法
问题的核心原因是:GetBestuursledenAsync()返回的Bestuurslid实体不在当前DbContext的跟踪范围内,EF Core会将这些实体判定为新数据,因此尝试向Bestuursleden表插入记录,而非仅在连接表VergaderingBestuurslid中创建关联。以下是几种可行的解决方式:
方案一:在同一DbContext实例中获取成员
直接在创建Vergadering的同一个DbContext范围内查询Bestuursleden,确保实体被当前上下文跟踪:
public async Task AddVergaderingAsync() { using (var _db = _factory.CreateDbContext()) { var vergadering = new Vergadering(); vergadering.Naam = "Lorem ipsum"; vergadering.DatumTijd = DateTime.Now; // 从当前DbContext获取成员,自动被跟踪 vergadering.Aanwezigen = await _db.Bestuursleden.ToListAsync(); _db.Vergaderingen.Add(vergadering); await _db.SaveChangesAsync(); } }
方案二:附加现有实体到当前DbContext
如果必须通过外部方法获取Bestuursleden,需手动将实体附加到当前上下文并标记为已存在:
public async Task AddVergaderingAsync() { using (var _db = _factory.CreateDbContext()) { var vergadering = new Vergadering(); vergadering.Naam = "Lorem ipsum"; vergadering.DatumTijd = DateTime.Now; var aanwezigen = await GetBestuursledenAsync(); foreach (var lid in aanwezigen) { // 告知EF该实体是已存在的数据库记录 _db.Entry(lid).State = EntityState.Unchanged; } vergadering.Aanwezigen = aanwezigen; _db.Vergaderingen.Add(vergadering); await _db.SaveChangesAsync(); } }
方案三:仅通过ID关联(高效推荐)
无需加载完整的Bestuurslid实体,仅创建包含ID的实体对象,EF会自动识别并创建连接表记录:
// 传入需要关联的Bestuurslid ID列表 public async Task AddVergaderingAsync(List<int> bestuurslidIds) { using (var _db = _factory.CreateDbContext()) { var vergadering = new Vergadering(); vergadering.Naam = "Lorem ipsum"; vergadering.DatumTijd = DateTime.Now; // 仅用ID构建实体,EF会直接创建关联 vergadering.Aanwezigen = bestuurslidIds.Select(id => new Bestuurslid { Id = id }).ToList(); _db.Vergaderingen.Add(vergadering); await _db.SaveChangesAsync(); } }
补充:显式配置多对多关系(可选)
EF Core 5+会自动生成连接表,但显式配置可以明确表名等细节,避免潜在问题:
在你的DbContext类中重写OnModelCreating方法:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Vergadering>() .HasMany(v => v.Aanwezigen) .WithMany(b => b.Vergaderingen) .UsingEntity(j => j.ToTable("VergaderingBestuurslid")); }
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

