向列表添加/插入数据后ViewModel未更新Model的技术问题
问题分析与解决方案
嗨,我看了你的代码,问题很明确:你创建了新的Tbl_Sales实体后,只把它加到了绑定UI的Sales集合里,但没有将这个实体注册到Entity Framework的上下文(ctx)中。EF需要跟踪实体的状态变化才能把数据写入数据库,你现在的操作只更新了UI显示,却没告诉EF要保存这条新记录。
具体修复步骤
1. 让EF上下文跟踪新实体
修改你的AddASale方法,在添加到Sales集合前,先把新实体加入EF的DbSet:
public void AddASale() { Tbl_Sales newsale = new Tbl_Sales(); newsale.SALEID = "2018..."; newsale.SALE = "...."; newsale.SALEDESC = "...."; newsale.START = Convert.ToDateTime("12/04/2018"); newsale.SESSIONS = 2; newsale.DAYS = 2; newsale.LOTS = 100; newsale.FIRSTLOT = 1; newsale.LASTLOT = 100; // 关键:将新实体注册到EF上下文,标记为待插入状态 ctx.Tbl_Sales.Add(newsale); // 更新UI绑定的集合 Sales.Add(newsale); SaveChanges(); }
2. 改用ObservableCollection优化UI更新
目前你用的List<Tbl_Sales>不会自动通知UI集合变化,建议换成ObservableCollection<Tbl_Sales>,它实现了INotifyCollectionChanged接口,添加/删除元素时会自动触发UI刷新,不用手动调用NotifyPropertyChanged:
// 替换原有的List<Tbl_Sales>定义 private ObservableCollection<Tbl_Sales> _sales; public ObservableCollection<Tbl_Sales> Sales { get { return _sales; } set { _sales = value; NotifyPropertyChanged(); } } // 同步修改FillSales方法,将查询结果转为ObservableCollection private void FillSales() { var q = (from a in ctx.Tbl_Sales select a).ToList(); this.Sales = new ObservableCollection<Tbl_Sales>(q); }
为什么原来的代码不生效?
Entity Framework的上下文通过实体状态来管理数据:
- 你直接
new出来的Tbl_Sales实例处于**游离(Detached)**状态,上下文完全不知道它的存在 - 调用
ctx.Tbl_Sales.Add(newsale)后,EF会把实体标记为Added状态 - 执行
SaveChanges()时,EF会遍历所有跟踪的实体,为Added状态的实体生成INSERT语句,写入SQL数据库
这样修改后,你的新增操作就能同时更新UI和数据库了。
内容的提问来源于stack exchange,提问作者Alex Tory
相关产品推荐
相关产品推荐

