在我的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();
}
2& 3 ;在计算任意数量的属性更改后保存数据,并保存在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 是我的首选选项,因为它会平衡执行的保存量。
所以,我的问题是:根据您的经验或其他方式,解决/解决此问题的最佳方法是什么?
提前致谢。
答案 0 :(得分:2)
稍微偏离;您是否还允许用户手动保存?我认为这对于这个问题很重要,因为它应该有助于确定您对自动保存行为的严格程度。
另一个考虑因素;允许部分提交?如果用户更改了一条信息,则会自动保存,用户会更改另一条,然后应用程序崩溃。自动保存是否可能允许数据损坏,因为它已经保存了原本未完全完成的原子操作?
现在,由于您提到数据库是本地数据库,因此您不必过多担心客户端 - 服务器数据库的延迟。这意味着提交的频率很高。因此,我完全排除了选项2。退出时保存一次似乎风险太大。
我喜欢对财产变化做出反应并保存的想法,但前提是上面的部分提交考虑不会成为问题。它将确保及时提交所有数据。
如果用户有办法手动保存他们的数据,我可能会采用定时方法。将其设置为10秒(或某个值),然后启动自动保存,并向用户显示自动保存已触发的通知。
我认为,主要担心的是用户期望发生的事情。如果您承诺每次更改,用户(可能)都不会对崩溃时的数据状态感到惊讶。与自动保存通知相同。通知用户保存间隔将使他们摆脱崩溃,确信他们的数据状态仍然相对新鲜。