Я имею дело с курьезным сценарием.
Я использую EntityFramework для сохранения (вставки / обновления) в базу данных SQL в многопоточной среде. Проблема в том, что мне нужно получить доступ к базе данных, чтобы увидеть, был ли уже создан регистр с определенным ключом, чтобы установить значение поля (выполняется), или он является новым для установки другого значения (в ожидании). Эти регистры идентифицируются уникальным путеводителем.
Я решил эту проблему, установив блокировку, поскольку знаю, что сущность не будет присутствовать ни в каком другом процессе, иными словами, у меня не будет одинакового guid в разных процессах, и, похоже, он работает нормально. Это выглядит примерно так:
static readonly object LockableObject = new object();
static void SaveElement(Entity e)
{
lock(LockableObject)
{
Entity e2 = Repository.FindByKey(e);
if (e2 != null)
{
Repository.Insert(e2);
}
else
{
Repository.Update(e2);
}
}
}
Но это подразумевает, что когда у меня огромное количество запросов на сохранение, они будут поставлены в очередь.
Интересно, есть ли что-то подобное (пожалуйста, примите это просто как идею):
static void SaveElement(Entity e)
{
(using ThisWouldBeAClassToProtectBasedOnACondition protector = new ThisWouldBeAClassToProtectBasedOnACondition(e => e.UniqueId)
{
Entity e2 = Repository.FindByKey(e);
if (e2 != null)
{
Repository.Insert(e2);
}
else
{
Repository.Update(e2);
}
}
}
Идея заключалась бы в том, чтобы иметь вид защиты, который защищал бы в зависимости от условия, поэтому каждый объект e имел бы собственную блокировку на основе свойства e.UniqueId.
Есть идеи?