У меня есть родительский объект, который мне нужен для проверки параллелизма (как указано ниже)
[Timestamp]
public byte[] RowVersion { get; set; }
У меня есть куча клиентских процессов, которые обращаются к значениям только для чтения из этой родительской сущности и в первую очередь обновляют ее дочерние сущности.
Ограничение
-
Клиенты не должны мешать друг другу работать (например, обновление дочерних записей не должно вызывать исключение параллелизма в родительской сущности).
-
У меня есть серверный процесс, который обновляет эту родительскую сущность, и в этом случае клиентский процесс должен выбросить, если родительская сущность была изменена.
Примечание: проверка параллелизма клиента является жертвенной, рабочий процесс сервера является критически важным.
Эта проблема
Мне нужно проверить (из процесса клиента), изменилась ли родительская сущность без обновления версии строки родительской сущности.
Достаточно просто выполнить проверку параллелизма родительской сущности в EF:
// Update the row version original value
_db.Entry(dbManifest)
.Property(b => b.RowVersion)
.OriginalValue = dbManifest.RowVersion; // the row version the client originally read
// Mark the row version as modified
_db.Entry(dbManifest)
.Property(x => x.RowVersion)
.IsModified = true;
IsModified = true
- прерыватель сделки, поскольку он заставляет изменить версию строки. Или, в контексте, эта проверка клиентского процесса вызовет изменение версии строки в родительском объекте, что бесполезно мешает рабочим процессам других клиентских процессов.
Произведение вокруг: Я мог бы потенциально обернуть SaveChanges
из процесса клиента в транзакции, а затем последующее чтение версии строки родительского объекта, в свою очередь, откат, если версия строка изменилась.
Резюме
Существует ли готовый способ с Entity Framework, где я могу SaveChanges
(в клиентском процессе для дочерних объектов), но также проверить, изменилась ли версия строки родительского объекта (без обновления версии строки родительского объекта).