В созданной мной ORM реализован механизм блокировки.Каждый тип объекта, такой как Product, Customer и т. Д., Имеет 2 дополнительных поля: «LockedBy (int)» и «LockedAt (datetime)».
LockedBy содержит идентификатор пользователя, который заблокировал объект, иlockedAt содержит метку времени, в которую он был заблокирован.
Итак, когда пользователь хочет начать редактирование объекта, код проходит этот процесс:
Получить объект из БД, '1'будучи ProductID
Product p = new Product(1);
Заблокировать сущность для текущего пользователя, вошедшего в систему
entity.Lock();
Сохранить / зафиксировать сущность в базе данных, Save () вызывает LockCheck (), которая возвращает true, еслизарегистрированный пользователь имеет разрешение на сохранение объекта.
entity.Save();
Пользователь имеет право сохранить сущность, если:
(LockedBy < 0 || LockedBy == LoggedInUser.UserID || LockedAt < DateTime.Now.AddMinutes(-30))
Примечание. Пользователи могут редактировать сущности, которые были заблокированы более 30 минут назад.Если у другого пользователя сущность открыта (на экране редактирования), то каждые 15 минут она будет всплывать и спрашивать, остается ли пользователь там, если это так, она делает запрос, который увеличивает LockedAt до Now (как скользящая блокировка)
На данный момент никакой другой пользователь не может редактировать эту сущность!
Код / пользователь может свободно редактировать эту сущность столько, сколько пожелает, и быть уверенным, что она не изменилась за ее спиной :)
Как только пользователь прекратил редактировать кодовые вызовы:
entity.Unlock()
затем
entity.Save()
, тогда это освобождает сущность для других пользователей, чтобы отредактировать ее