Я просто настроил AutoFac в своем проекте MVC и установил для EF DbContext значение InstancePerRequest
.До сих пор DbContext был статическим синглтоном.Похоже, что область «запроса» AutoFac на самом деле не весь запрос.Я получаю сообщение об ошибке:
Операция не может быть завершена из-за удаления DbContext.
Так же, как некоторые другие вопросы.
Я ожидаю, что контекст будет удален после обработки всего запроса, но исключение появляется, когда я пытаюсь получить доступ к лениво загруженным свойствам в представлениях или операторах возврата.
Пример проблемы:
[HttpGet]
public JsonResult GetLotoLockNumbers(int permitId)
{
var lockNums = lockService.FindLotoLockNumbers(permitId);
// this line throws an exception because... (go to last line)
return Json(string.Join(", ", lockNums), JsonRequestBehavior.AllowGet);
}
public IEnumerable<string> FindLotoLockNumbers(int permitId)
{
// returns an attached entity
var permit = Repository.GetDBEntityWithId<PermPermit>(permitId);
return GetLotoLockNumsForPermit(permit).AsEnumerable();
}
private IEnumerable<string> GetLotoLockNumsForPermit(PermPermit permit, int? configLockItemId = null)
{
// lazily accesses virtual properties
var lotoLockItems = permit.permitSections.SelectMany(section => section.childs.Where(
(sectionItem) => IsLotoLockSectionItem(sectionItem, configLockItemId))).AsEnumerable();
return lotoLockItems.SelectMany(item => LotoLockHelper.ParseLockNums(item.value)).AsEnumerable();
}
private bool IsLotoLockSectionItem(PermPermitSectionItem item, int? configLockItemId = null)
{
// ...the context has been exposed when this line gets lazily executed
return lockItemIds.Contains(item.confSectionItem.id);
}
Мое любимое решение было бы, если бы я мог просто расширить область действия контекста, чтобы он продолжался для всего запроса (a singleton
не подходит).В противном случае мне придется вносить изменения во весь код, чтобы убедиться, что все загружено перед действиями контроллера return
.