WPF MVVM:自动保存数据

6
在我的WPF MVVM应用程序中,我希望对于我的Entity Framework实体类所做的更改能够自动持久化到数据库。我已经有一些关于实现这个功能的想法,但似乎没有一个是最优的。
以下是我目前的(非最优)想法:
  1. Use a DispatcherTimerto save changes every interval:

    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(1);
    timer.Tick += (sender, args) => Repository.SaveChanges();
    timer.Start();
    
  2. Save changes in the program's OnExit() method.

    protected override void OnExit(ExitEventArgs e)
    {
        Repository.SaveChanges();
        base.OnExit(e);
    }
    
  3. Save changes every time OnPropertyChanged() is called on one of my Entities:

    protected virtual void OnPropertyChanged(string propertyName)
    {
        Repository.SaveChanges();
    }   
    
  4. A combination of 2 & 3; save the data after counting an arbitrary number of property changes and also save in OnExit() to catch any changes that didn't reach the change limit:

    const int limit = 5;
    int changes = 0;    
    
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (++changes == limit)
        {
            Repository.SaveChanges();
            changes = 0;
        }
    }
    
我认为其中的13是表现最差的,而2(不确定)如果程序崩溃将不会保存任何更改。我更喜欢4,因为它平衡了所执行的保存次数。
所以,我的问题是:在您的经验或其他方面,如何最好地解决这个问题?
提前感谢。

出于好奇,这是一个客户端/服务器应用程序还是数据库存储和本地访问? - BoltClock
@BoltClock 它被存储并在本地访问。 - aligray
我在我的应用程序中尝试了1、2、4,但我不建议使用任何一种。在我看来,最好的解决方案是同时提供手动“保存”选项以及在退出时警告是否有未保存的更改,让用户选择保存更改或忽略。 - eandersson
@Fuji,你能详细说明一下为什么不推荐它们吗? - aligray
1个回答

2
略微偏离一下话题;您是否也允许用户手动保存?我认为这对问题很重要,因为它应该有助于确定您需要对自动保存行为进行多严格的限制。
另一个考虑因素是:部分提交是否被允许?如果用户更改了一条信息,则会触发自动保存,用户更改了另一条信息,然后应用程序崩溃。自动保存是否可能导致数据损坏,因为它已经保存了尚未完全完成的原子操作?
现在,由于您提到数据库是本地数据库,所以您不必太担心客户端-服务器数据库的延迟。这意味着高频率的提交应该没问题。因此,我完全排除选项2。仅在退出时保存一次似乎太冒险了。
我喜欢根据属性更改做出反应并进行保存的想法,但前提是上面提到的部分提交是否会成为问题。这将确保所有数据及时提交。
如果用户有手动保存数据的方式,我可能会选择定时方法。将其设置为10秒(或某个值),并启动自动保存,同时向用户显示通知,说明自动保存已启动。
我认为需要担心的主要问题是用户期望发生的事情。如果您在每次更改时都进行提交,用户(可能)不会对崩溃时的数据状态感到惊讶。同样适用于自动保存通知。告知用户保存间隔将使他们对崩溃不以为意,同时确信其数据状态仍然相对新鲜。

最终,这个系统的想法是消除手动保存的需要,让用户专注于手头的任务,而不必担心无聊的事情。我非常喜欢您在执行自动保存后提醒用户的想法。 - aligray
完全理解,所以在你的情况下,我会选择属性更改方法。虽然我不认为允许手动保存和要求手动保存是同一件事。如果您允许它,请采用定时方法,这样用户在退出应用程序时仍然感觉掌控自己的数据。 - Josh Smeaton
决定为查看和编辑数据提供两个单独的视图。当用户单击“保存”时,它提供了一个很好的钩子来保存所做的更改。感谢您的输入! - aligray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接