Этот вопрос касается наилучшей практики для обработки многих вставок или обновлений с использованием Microsoft Entity Framework. Проблема в том, что мы написали долговременную программу, которая отбрасывает тысячи записей из базы данных, а затем обновляет одно поле в каждой из этих записей, один за другим. К большому сожалению, мы поняли, что каждая из этих обновленных записей была заблокирована в течение времени, в течение которого ObjectContext не был удален. Ниже приведен некоторый псевдокод (на самом деле не выполняется), чтобы проиллюстрировать:
using(ObjectContext context = new ObjectContext())
{
var myRecords = context.CreateObjectSet<MyType>().AsQueryable();
foreach(var record in myRecords)
{
record.MyField = "updated!";
context.SaveChanges();
//--do something really slow like call an external web service
}
}
Проблема заключается в том, что нам нужно делать много обновлений без какого-либо учета транзакций. Мы были удивлены, осознав, что вызов context.SaveChanges() фактически создает блокировку записей и не освобождает его до тех пор, пока ObjectContext не будет удален. Мы особо НЕ хотим блокировать записи в базе данных, так как это система с высоким трафиком, и программа может работать в течение нескольких часов.
Итак, вопрос заключается в следующем: каков оптимальный способ сделать много обновлений в Microsoft Entity Framework 4 БЕЗ делать все это на одной длинной транзакции, которая блокирует БД? Мы надеемся, что ответ заключается не в создании нового ObjectContext для каждого обновления...