Есть десктопное приложение. Упрощенно, в нем есть несколько коллекций (ProductList), куда пользователь может сканировать продукты (ProductRecord) или добавлять вручную, затем отправить на сервер.
Есть требование сохранять на диск все коллекции после каждого изменения их и их элементов, чтобы при внешних сбоях избежать потери информации.
Для биндинга к UI ProductList реализует INotifyCollectionChanged, а ProductRecord - INotifyPropertyChanged.
Сейчас постоянный бэкап изменений реализован через класс Backuper, который подписан на событие ProductList.CollectionChanged и на PropertyChanged каждого ProductRecord. Далее, когда происходит одно из двух событий, ProductList целиком со всеми его ProductRecord сериализуется в файл.
На небольших коллекциях такой алгоритм работает нормально, однако в будущем хотелось перейти на БД и обновлять только изменившиеся элементы, а не коллекции целиком.
Решил попробовать SQLite + Entity Framework 6.2, и возникли вопросы:
1. Большинство статей по EF описывают способ работы с данными: [выборка] - [модификация] - [запись], а DbContext рекомендуется освобождать как можно раньше. В моем же случае время жизни списка совпадает со временем жизни приложения, выборка требуется только при старте, для загрузки сохраненных данных, дальше только модификация с последующей записью. Получается, мне нужно постоянно держать DbContext. Это допустимо, или нужен другой подход к работе с данными?
2. Вопрос относительно механизма бэкапов в целом: пытался гуглить, но не встречал подобных вариантов. Возможно, так мало кто делает потому, что есть другой подход, о котором я не знаю?
Архитектор информационных систем и баз данных. Ful
Решение определяется размером списка. Если размер такой, что возникает сильный своп по оперативной памяти, то надо работать с выборками из sql. По любому все в экран не влезет и висанет.
До свопа очень далеко - обычно в списке около 500 небольших элементов, в будущем может увеличиться до 5000, но не более. Изменения элементов происходят происходят с подачи пользователя, поэтому частота их небольшая. С 5000 проверял - проблем нет, приложение памяти съедает не более 200 МБ.
Правильно я понимаю, что в таком случае работать со списками из памяти и по мере изменений синхронизировать с БД - это нормальная практика?
Вполне нормально, особенно для работы с БД.
А сущности в памяти (и на экране) тогда соответственно могут быть изменены/удалены(помечены)/добавлены, что позднее "разветвит" их поведение (в конечном итоге update / delete / insert)