【发布时间】:2018-03-08 00:13:05
【问题描述】:
嘿,我最近刚刚学会了如何使用扩展方法,很高兴能在我当前的项目中实现它。
我的目标: 我想检查一个条目是否存在于我的表中的辅助类中,因为我将在多个控制器中使用它来确定在我的导航栏中显示哪些导航链接:
我的问题: 我不知道如何在我的静态助手类中访问我的 dbcontext。我的 dbcontext 控制器接受一个我不知道如何传入我的静态类的参数。我认为创建一个新的 dbcontext 可以解决下面解释的范围问题,但我不知道如何将可选参数传递给我的构造函数。
我尝试了什么: 将 ApplicationDbContext 作为参数传递。这适用于我的控制器中的单个方法调用,但是当调用多个扩展方法(检查用户拥有哪些游戏帐户)时,我得到一个 ObjectDisposedException。
ObjectDisposedException:无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。 对象名称:'ApplicationDbContext'。
据我了解,这是一个范围问题,即第一个方法调用在完成后处理上下文,而我试图在下一次调用中使用相同的上下文?我可以做些什么来解决这个问题?
我尝试阅读此链接Cannot access a disposed of object in ASP.NET Core when injecting DbContext,但它对我没有帮助,因为它需要 Startup.cs 类中的 ApplicationBuilder。
解决方案更新 我在每次方法调用后都处理了 dbcontext,因为我将它放入了一个变量中。相反,我直接在传递的上下文中调用它并且它可以工作:
【问题讨论】:
-
你怎么打电话
HasDota2Account()?您是否将其传递给已处理的DbContext?_context来自哪里?该错误似乎表明它确实在您调用UpdateNavLinks()之前被处理。因此,您似乎不应该处置它,或者应该在该方法中使用本地实例化的上下文。尝试共享>数据上下文对象通常会导致这个问题。 -
另外,在 HasDota2Account 中,db 是与上下文相同的对象;当 db 被 Disposed 时,上下文也会如此。如果您在调用 HasDota2Account 后尝试使用上下文,则会出现相同的异常。
-
我从控制器调用它,就像我的第一张图片一样。 context 是我的控制器上的一个字段,在构造函数中被实例化。不知道有没有处理掉。我不认为我了解如何实例化本地 dbcontext _,因为它需要选项参数,我无法在 _of startup.cs 之外传递
-
@simonatrcl 啊,你是对的。这就是问题所在,它现在有效。我将用答案更新我的问题,如果您想获得荣誉,可以将其写在答案中,我会投票 :) 也感谢大卫!
-
@J.Kirk.: 太好了!谢谢,但不用担心分数,那些阅读问题的人可以很容易地看到 cmets。干杯!
标签: c# entity-framework extension-methods dbcontext asp.net-core-2.0