如何在数据库中发生更改时更新绑定的项列表
本文关键字:更新 绑定 列表 数据库 | 更新日期: 2023-09-27 18:07:32
我刚刚注意到我无法刷新从DB获取的值。存储(即从客户端到数据库)按预期工作。第一次加载同样有魅力。
然而,如果有人删除了数据库中的一行(比如,使用SQL Management Studio),直到我重新实例化了整个视图模型,这个更改才会在我的客户端中生效。只调用Refresh()不会获取更改。更改记录中加载的值也是如此。
然而,添加到表中是在…
我(重新)通过调用视图模型中的以下方法从DB加载视图中显示的值。
public ViewModel()
{
Reload();
...
}
public void Reload()
{
_data.Set<Order>().Load();
_data.Set<TimeFrame>().Load();
Orders = _data.Set<Order>().Local;
TimeFrames = _data.Set<TimeFrame>().Local;
...
}
readonly Data _data;
private ObservableCollection<Order> _orders;
private ObservableCollection<TimeFrame> _timeFrames;
public ObservableCollection<Order> Orders
{
get { return _orders; }
set { _orders = value; OnPropertyChanged("Orders"); }
}
public ObservableCollection<TimeFrame> TimeFrames
{
get { return _timeFrames; }
set { _timeFrames = value; OnPropertyChanged("TimeFrames"); }
}
我错过了什么?
这里的问题是,你加载你的值,然后你使用本地属性。
Local集合包含已在上下文中加载的所有值。如果第一次加载值(1,2,3,4),则本地集合将包含值(1,2,3,4)。第二次加载时,可能会加载值(1,4,5)。本地集合将包含值(1,2,3,4,5)
你应该这样做
Orders = new ObservableCollection(_data.Set<Order>());
如果它是一个只读场景,你不需要更新和保存你的数据,你甚至应该加载你的数据作为notracking,所以你不会有缓存问题,你会有更少的EF开销,因为你的实体不会被跟踪
Orders = new ObservableCollection(_data.Set<Order>().AsNoTracking());