WPF MVVM: сохранение данных автоматически - PullRequest
6 голосов
/ 29 мая 2011

В моем приложении 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;
        }
    }
    

Я полагаю, 1 & 3 являются худшими из всех, и 2 (не уверен на 100%) не сохранит никаких изменений если программа вылетает. 4 - мой предпочтительный вариант, поскольку он уравновешивает количество сохранений.

Итак, мой вопрос: по вашему опыту, как лучше решить эту проблему?

Заранее спасибо.

1 Ответ

2 голосов
/ 29 мая 2011

немного отвлечься; Вы также разрешаете пользователю сохранять вручную? Я считаю, что это важно для вопроса, так как он должен помочь определить, насколько жестким должно быть поведение при автосохранении.

Другое соображение; разрешены частичные коммиты? Если пользователь изменяет одну часть информации, включается автосохранение, пользователь изменяет другую часть, и затем приложение вылетает. Возможно ли, что автоматическое сохранение может привести к повреждению данных из-за того, что оно сохранило то, что должно было быть атомарной операцией, которая не была полностью завершена?

Теперь, поскольку вы упоминаете, что база данных является локальной, вам не нужно слишком беспокоиться о задержке клиент-серверной базы данных. Это означает, что высокая частота коммитов должна быть хорошей. Поэтому я бы полностью исключил вариант 2. Экономия один раз на выходе кажется слишком рискованной.

Мне нравится идея реагировать на изменения свойств и сохранять тогда, но только если рассмотрение частичной фиксации выше не будет проблемой. Это обеспечит своевременную передачу всех данных.

Если у пользователя есть способ вручную сохранить свои данные, я бы, вероятно, выбрал временный подход. Установите для него значение 10 секунд (или какое-либо значение) и отключите автосохранение, при этом пользователю отобразится уведомление о срабатывании автосохранения.

Главное, о чем я должен беспокоиться, - это то, чего ожидает пользователь. Если вы фиксируете каждое изменение, пользователь (вероятно) не будет удивлен состоянием своих данных в случае сбоя. То же самое относится и к уведомлению об автоматическом сохранении. Информирование пользователя об интервалах сохранения позволит ему не обращать внимания на сбой, имея уверенность в том, что состояние их данных все еще будет относительно свежим.

...