DbContext 获取在使用区域内处理

DbContext get's disposed within using region

我刚刚发现,当我尝试在我的 DbContext 中的 DbSet 上使用 .Add() 方法时,出现以下异常:

System.InvalidOperationException : The operation cannot be completed because the DbContext has been disposed.

这个堆栈跟踪让我回到了这个方法的第 238 行:

现在确实该方法使用了另外两种方法(CheckForBleKeyInDbCheckForMpSwitchInDb),它们使用了它们自己的 using(_db = new BeheerContext()),但由于某种原因这不会产生任何错误。

测试变量不会产生任何异常可能是因为它们实际上并没有连接到数据库,至少这是我的猜测。

我想知道究竟是什么导致了这个异常,我该如何预防。

取出子调用中的任何子using。系统的架构在超出 scope 之后并不知道你想使用它。找到有问题的 usings 并删除它们,只让整体 using 来完成工作。

不要将上下文用作 class 中的字段,这样所有方法都会共享它,并会在它们的 using 语句结束时处理它。

Now it is true that this method uses two other methods (CheckForBleKeyInDb and CheckForMpSwitchInDb) which use their own using(_db = new BeheerContext()) but this doesn't generate any errors for some reason.

因此,在第一次调用这些方法后,您的上下文也会被释放。

而是在方法中创建它们(var _db = ...):

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

您的测试变量不会生成异常,因为它们不会 select 来自表。例如,如果您使用

,您会得到相同的异常
var test1 = _db.BleKeys.First();