DbContext размещается в пределах используемой области

Я только что узнал, что когда я пытаюсь использовать метод .Add() для DbSet в моем DbContext, я получаю следующее исключение:

System.InvalidOperationException: операция не может быть завершена, так как DbContext был удален.

Эта трассировка стека вернула меня к строке 238 этого метода: Метод

Теперь верно, что этот метод использует два других метода (CheckForBleKeyInDb и CheckForMpSwitchInDb), которые используют свои собственные using(_db = new BeheerContext()), но по какой-то причине это не генерирует никаких ошибок.

Тестовые переменные не генерируют никаких исключений, вероятно, потому, что они на самом деле не подключаются к базе данных, по крайней мере, это мое предположение.

Я хотел бы знать, что именно вызывает это исключение и как я могу его предотвратить.


person Jeroen    schedule 17.08.2017    source источник
comment
Вам нужно назначить db локально. на самом деле это другие методы, которые распоряжаются db и dbset. Вам необходимо предоставить фактический код в виде минимально воспроизводимого примера и не использовать изображение. Они не очень помогают в использовании, чтобы лучше оценить проблему.   -  person Nkosi    schedule 17.08.2017
comment


Ответы (2)


Не используйте контекст как поле в своем классе, тогда все методы будут использовать его совместно и будут размещать его в конце своих операторов использования.

Теперь верно, что этот метод использует два других метода (CheckForBleKeyInDb и CheckForMpSwitchInDb), которые используют свои собственные using(_db = new BeheerContext()), но по какой-то причине это не генерирует никаких ошибок.

Итак, после первого вызова этих методов ваш контекст тоже удаляется.

Вместо этого создайте их в методе (var _db = ...):

using(var _db = new BeheerContext())
{
   //...
}

Ваши тестовые переменные не генерируют исключений, потому что они не выбираются из таблиц. Вы бы получили такое же исключение, если бы, например, использовали

var test1 = _db.BleKeys.First();
person Tim Schmelter    schedule 17.08.2017

Выньте любой сабвуфер using в вызовах сабвуфера. Архитектура системы не знает, что вы хотите использовать что-то после того, как оно выйдет из области. Найдите оскорбительные usings и удалите их, а для работы используйте только using в целом.

person ΩmegaMan    schedule 17.08.2017