如何在数据库中发生更改时更新绑定的项列表

本文关键字:更新 绑定 列表 数据库 | 更新日期: 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());