C#中使用EF更新数据后,DataGridView无法更新刷新的问题求助
解决EF更新后DataGridView无法同步的问题
问题根源分析
你的代码存在几个关键问题导致DataGridView无法同步更新:
- EF上下文未保存更改:
tr.Update(item)仅标记实体为修改状态,未将更改持久化到数据库,load()自然拿不到新数据。 - 低效的实体查找方式:遍历所有实体匹配ID,性能差且没必要。
- 数据加载时的内存排序:
AsEnumerable()先把全表数据拉到内存再排序,既影响性能,也可能因为上下文缓存拿到旧数据。 - 空catch块:隐藏了加载数据时的异常,无法排查潜在问题。
修改后的代码实现
1. 优化更新操作代码
// 直接根据ID查询目标实体,避免遍历全表 var targetItem = tr.GetAll().FirstOrDefault(item => item.ID == id); if (targetItem != null) { targetItem.Status = "Approved"; // 修正拼写错误:Aproved → Approved tr.Update(targetItem); tr.SaveChanges(); // 必须调用此方法将更改写入数据库 load(); // 所有更新完成后统一重新加载数据 }
2. 修正数据加载方法
private void load() { try { // 移除AsEnumerable(),让排序逻辑在数据库层面执行,提升性能并确保数据最新 var query = from t in ffe.tbl_Partners where t.Status == "UnProved" orderby t.ID descending select new { t.ID, t.Partner_Name, t.Advanced_Amount, t.Date, t.Tbl_Project.Project_Name, t.Status }; dt = query.ToList().ToDataTable(); // 先清空BindingSource再赋值,确保DataGridView识别数据源变化 tblPartnersBindingSource.DataSource = null; tblPartnersBindingSource.DataSource = dt; advancedDataGridView1.DataSource = tblPartnersBindingSource; // 强制DataGridView刷新UI advancedDataGridView1.Refresh(); } catch (Exception ex) { // 替换空catch,捕获并显示异常,方便排查问题 MessageBox.Show($"加载数据失败:{ex.Message}"); } }
额外注意事项
- DbContext缓存问题:如果
ffe是长期复用的DbContext实例,可能会缓存旧数据。建议每次load()时创建新的DbContext实例,或者在更新后调用ffe.Entry(targetItem).Reload()刷新实体。 GetAll()方法的返回类型:确保tr.GetAll()返回的是IQueryable<tbl_Partners>,这样FirstOrDefault会在数据库层面执行查询,而非内存遍历。- 状态值拼写一致性:统一使用"Approved"和"UnProved",避免因拼写错误导致数据过滤异常。
内容的提问来源于stack exchange,提问作者maher babar
相关产品推荐
相关产品推荐

