Область запросов AutoFac не является ВСЕМ запросом - PullRequest
0 голосов
/ 21 сентября 2018

Я просто настроил 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.

1 Ответ

0 голосов
/ 21 сентября 2018

Я был совершенно неправ насчет AutoFac.Проблема в коде здесь не в том, что выполнение запроса откладывается, а в том, что lockItemIds объект является IEnumerable, чье выполнение откладывается.Я загрузил список и сохранил его в статической переменной, используя старый контекст, и не понял, что он не был выполнен немедленно.

Область запросов AutoFac идеальна.

Урок:используйте отладчик, чтобы убедиться, что вы точно знаете, какой объект вызывает проблему, и проверьте свои статические переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...