在我的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 是我的首选,因为它可以平衡执行的保存量。

    因此,我的问题是:以您的经验或其他方式,解决/解决此问题的最佳方法是什么?

    提前致谢。

    最佳答案

    离题;离题您还允许用户手动保存吗?我认为这对这个问题很重要,因为它应该有助于确定自动保存行为的严格程度。

    另一个考虑;是否允许部分提交?如果用户更改一条信息,则自动保存启动,用户更改另一条信息,然后应用程序崩溃。由于自动保存已经保存了尚未完全完成的原子操作,因此自动保存是否有可能导致数据损坏?

    现在,由于您提到数据库是本地数据库,因此您不必担心客户端-服务器数据库的延迟。这意味着高频率的提交应该是可以的。因此,我将完全排除选项2。退出时保存一次似乎太冒险了。

    我喜欢对属性更改使用react然后保存的想法,但是前提是上面的部分提交考虑不会成为问题。它将确保及时提交所有数据。

    如果用户有一种手动保存数据的方法,那么我可能会选择定时方法。将其设置为10秒(或某个值),然后启动自动保存,并向用户显示已触发自动保存的通知。

    我相信,主要担心的是用户期望发生的事情。如果您要进行所有更改,则用户(可能)不会对崩溃时的数据状态感到惊讶。自动保存通知也是如此。通知用户保存间隔将使他们摆脱崩溃,并确信其数据状态仍将相对较新。

    10-05 21:08