Я не нашел похожих вопросов/ответов для своей цели.
В нескольких действиях моих контроллеров (приложение MVC 4/EF 5) у меня есть функции для обновления базы данных, но эти функции не влияют на вывод пользователя (функции обновления информации после выбора). И я хочу отправлять эти функции в асинхронных потоках (которые завершатся после того, как пользователь получит отображаемую страницу). Я не хочу ждать завершения потоков и рендеринга страницы. Как насчет контекста базы данных в этом случае? Время жизни моего контекста - "за запрос", и оно удаляется в Application_EndRequest:
protected virtual void Application_EndRequest()
{
var entityContext = HttpContext.Current.Items["_Context"] as DbContext;
if (entityContext != null)
entityContext.Dispose();
}
Я использую собственные контексты в потоках (используя блоки для правильного размещения).
using (DbContext db = new DbContext())
{
....
}
Но если я хочу прикрепить объект к DbContext в потоке, я получаю сообщение об ошибке «Объект с таким же ключом уже существует в ObjectStateManager» в нескольких случаях. Это странно, потому что я использую загрузку с опцией AsNoTracking(), а состояние сущности «отсоединено» в основном контексте перед вызовом нового потока. В другом случае, когда я снова пытаюсь запросить объект из базы данных в потоке и изменить его (вместо присоединения), у меня несколько раз возникает ошибка «Объект находится в отсоединенном состоянии». Используют ли два экземпляра Context один ObjectStateManager? И ошибки появляются в зависимости от времени размещения контекста основного потока. Я имею в виду, что до или после удаления основного контекста я использую контекст в потоке...
Как я могу работать с асинхронными потоками с собственным контекстом в этой ситуации? Спасибо.