在我的WPF MVVM应用程序中,我想将对Entity Framework
实体类的更改自动持久化回到数据库。我对实现此功能有一些想法,但似乎都不是最优的。
这是我目前(非最佳)的想法:
DispatcherTimer
在每个时间间隔保存更改:DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += (sender, args) => Repository.SaveChanges();
timer.Start();
OnExit()
方法中。protected override void OnExit(ExitEventArgs e)
{
Repository.SaveChanges();
base.OnExit(e);
}
OnPropertyChanged()
之一上调用Entities
时,保存更改:protected virtual void OnPropertyChanged(string propertyName)
{
Repository.SaveChanges();
}
OnExit()
中以捕获未达到更改限制的所有更改:const int limit = 5;
int changes = 0;
protected virtual void OnPropertyChanged(string propertyName)
{
if (++changes == limit)
{
Repository.SaveChanges();
changes = 0;
}
}
我假设 1 和 3 在所有这些程序中性能最差,并且 2 (不确定100%确定)在程序崩溃时不会保存任何更改。 4 是我的首选,因为它可以平衡执行的保存量。
因此,我的问题是:以您的经验或其他方式,解决/解决此问题的最佳方法是什么?
提前致谢。
最佳答案
离题;离题您还允许用户手动保存吗?我认为这对这个问题很重要,因为它应该有助于确定自动保存行为的严格程度。
另一个考虑;是否允许部分提交?如果用户更改一条信息,则自动保存启动,用户更改另一条信息,然后应用程序崩溃。由于自动保存已经保存了尚未完全完成的原子操作,因此自动保存是否有可能导致数据损坏?
现在,由于您提到数据库是本地数据库,因此您不必担心客户端-服务器数据库的延迟。这意味着高频率的提交应该是可以的。因此,我将完全排除选项2。退出时保存一次似乎太冒险了。
我喜欢对属性更改使用react然后保存的想法,但是前提是上面的部分提交考虑不会成为问题。它将确保及时提交所有数据。
如果用户有一种手动保存数据的方法,那么我可能会选择定时方法。将其设置为10秒(或某个值),然后启动自动保存,并向用户显示已触发自动保存的通知。
我相信,主要担心的是用户期望发生的事情。如果您要进行所有更改,则用户(可能)不会对崩溃时的数据状态感到惊讶。自动保存通知也是如此。通知用户保存间隔将使他们摆脱崩溃,并确信其数据状态仍将相对较新。