WPF MVVM:自动保存数据

ali*_*ray 6 c# wpf entity-framework save mvvm

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

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

  1. 使用a DispatcherTimer保存每个间隔的更改:

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

    protected override void OnExit(ExitEventArgs e)
    {
        Repository.SaveChanges();
        base.OnExit(e);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 每次OnPropertyChanged()调用我的一个保存更改Entities:

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

    const int limit = 5;
    int changes = 0;    
    
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (++changes == limit)
        {
            Repository.SaveChanges();
            changes = 0;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我假设13是所有这些中表现最差的,如果程序崩溃,2(不是100%肯定)将不会保存任何更改.4是我的首选选项,因为它平衡了执行的保存量.

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

提前致谢.

Jos*_*ton 2

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

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

现在,既然您提到数据库是本地数据库,那么您不必太担心客户端-服务器数据库的延迟。这意味着高频率的提交应该没问题。因此,我完全排除选项2。退出时保存一次似乎风险太大。

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

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

我认为,最需要担心的是用户期望发生的事情。如果您对每项更改都进行了承诺,那么用户(可能)不会对其崩溃时数据的状态感到惊讶。自动保存通知也是如此。通知用户保存间隔将使他们摆脱崩溃的困扰,并确信他们的数据状态仍然相对新鲜。