EF6 如何处理Candidate与CandRemark一对多关系的增改操作
Candidate与CandRemark一对多关系的插入及更新实现
一、插入带备注集合的Candidate实体
直接在创建Candidate实例时初始化Candremarks集合并添加备注即可,EF会自动处理外键关联,无需手动设置FkCandId:
private async void button1_Click(object sender, EventArgs e) { var newCandidate = new Candidate { FirstName = "John", MiddleName = "A", LastName = "Sam", Candremarks = new HashSet<Candremark> { new Candremark { RemarkDate = DateTime.Parse("2022-11-08"), Remark = " Comments -------- 2" } } }; await _dbContext.Candidates.AddAsync(newCandidate); await _dbContext.SaveChangesAsync(); }
提示:
- 用
DateTime.Parse替代Convert.ToDateTime,能降低格式解析出错的概率 - 异步方法要搭配
await关键字,确保操作执行完成后再执行保存逻辑
二、更新现有Candidate的备注集合
你的代码未生效,通常是_currCandEntity未被当前上下文跟踪,或Candremarks集合未正确加载导致的。修复后的代码如下:
private void btnAddRemark_Click(object sender, EventArgs e) { DateTime d = DateTime.Now; // 确保实体被当前上下文跟踪,若实体来自其他上下文/缓存,需先附加 if (_dbContext.Entry(_currCandEntity).State == EntityState.Detached) { _dbContext.Candidates.Attach(_currCandEntity); } // 若备注集合未加载,手动触发加载(延迟加载未启用时需要) if (!_dbContext.Entry(_currCandEntity).Collection(c => c.Candremarks).IsLoaded) { _dbContext.Entry(_currCandEntity).Collection(c => c.Candremarks).Load(); } // 添加新备注,无需手动设置FkCandId,EF会自动填充外键值 _currCandEntity.Candremarks.Add(new Candremark { Remark = txtRemark.Text, RemarkDate = d.Date }); _dbContext.SaveChanges(); }
关键点:
- 不要手动设置
FkCandId,EF会通过实体关联自动维护外键 - 若
_currCandEntity来自外部上下文或缓存,必须先附加到当前上下文才能跟踪变更 - 你的实体类中
Candremarks已设为virtual,若启用延迟加载,集合会自动加载;未启用则需显式调用Load()
内容的提问来源于stack exchange,提问作者Unis
相关产品推荐
相关产品推荐

