Сохранение изменений Entity

Необходимо отслеживать изменения Entity (под entity я подразумеваю некий объект, с которым взаимодействует клиент через апи).

Пример задачи:

  • Клиент имеет Api.dll, через которую взаимодействует с сервером. В данном апи реализованы статические методы (операции) с объектами.

Пример:

IOrder GetOrderById(Guid orderId) //делает Get запрос на сервер и возвращает IOrder по его Guid

bool AddGuest(IOrder order) //добавляет гостя к заказу
  • В конечном счёте, после каких-либо изменений, необходимо вызвать метод void SubmitChanges(ICredentials credentials), который сохраняет изменения на сервере в кэше (ICredentials - хранит в себе Guid клиента и некоторые его характеристики, которые нужны для сервера)

Операции по взаимодействию с Entity (пример - AddGuest) сохраняет изменения во временный кэш, который после вызова SubmitChanges переносит их из временного кэша в настоящий.

Вроде-бы, всё классно. Если клиенту не нужно сохранять изменения - он просто этого не делает. Сервер меньше напрягается и на него летит меньше запросов. Но проблема, которая стоит - что, если несколько клиентов будут редактировать одновременно один, например, IOrder? И те, и другие изменения будут сохраняться во временном кэше, заменяя друг друга. Как можно было-бы блокировать изменения с нескольких клиентов одновременно одной сущности до её сохранения в конечном кэше? Может добавить в IOrder свойство Version, которое-бы изменялось после каждой операции с сущностью? Метаюсь между тем, как это правильнее сделать, а не через какие-нибудь костыли.

P.S. Заранее ответ на вопрос, почему-бы не делать изменения на клиенте и потом сохранять конкретный заказ на сервере, например, создав метод SubmitChanges(IOrder order, ICredentials credentials)? Дело в том, что на клиенте пользователь может унаследоваться от IOrder, создав свой класс Order, поменять всё на свете и закинуть это на сервер. Именно из-за этого была придумана реализация через временный кэш.

P.S.S. После вызова SubmitChanges временный кэш очищается

P.S.S.S. Для чего нужен кэш - чтобы избежать постоянных запросов в базу данных. После некоторых действий кэш из ConcurrentObservableDictionary попадает окончательно в базу данных

Кэш хранится в следующем формате:

ConcurrentObservableDictionary<Guid, IOrder> _orders; //кэш

Dictionary<Guid, IOrder> _tempOrders; //временный кэш

Ответы (0 шт):