WPF MVVM:自动保存数据

时间:2011-05-29 06:36:34

标签: c# wpf entity-framework mvvm save

在我的WPF MVVM应用程序中,我希望对Entity Framework实体类的更改会自动保留回数据库。我对实现这个功能有一些想法,但它们似乎都不是最优的。

以下是我目前的(非最佳)想法:

  1. 使用DispatcherTimer每隔一段时间保存更改:

    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(1);
    timer.Tick += (sender, args) => Repository.SaveChanges();
    timer.Start();
    
  2. 保存程序的OnExit()方法中的更改。

    protected override void OnExit(ExitEventArgs e)
    {
        Repository.SaveChanges();
        base.OnExit(e);
    }
    
  3. 每次OnPropertyChanged()之一调用Entities时保存更改:

    protected virtual void OnPropertyChanged(string propertyName)
    {
        Repository.SaveChanges();
    }   
    
  4. 2& 3 ;在计算任意数量的属性更改后保存数据,并保存在OnExit()以捕获未达到更改限制的任何更改:

    const int limit = 5;
    int changes = 0;    
    
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (++changes == limit)
        {
            Repository.SaveChanges();
            changes = 0;
        }
    }
    
  5. 我假设 1 & 3 是所有这些中效果最差的,如果程序崩溃, 2 (不是100%肯定)将无法保存任何更改。 4 是我的首选选项,因为它会平衡执行的保存量。

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

    提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

我喜欢对财产变化做出反应并保存的想法,但前提是上面的部分提交考虑不会成为问题。它将确保及时提交所有数据。

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

我认为,主要担心的是用户期望发生的事情。如果您承诺每次更改,用户(可能)都不会对崩溃时的数据状态感到惊讶。与自动保存通知相同。通知用户保存间隔将使他们摆脱崩溃,确信他们的数据状态仍然相对新鲜。