2

嘿,我刚刚学会了如何使用扩展方法,并非常兴奋地在我当前的项目中实现它。如何在静态类中使用dbcontext? (ObjectDisposedException)

我的目标: 我想查一下我的表中是否存在一个辅助类的条目,因为我打算使用它在多个控制器能够确定在我的导航栏显示其导航链接:enter image description here

我的问题: 我不知道如何来访问我的DbContext在我的静态辅助类。我的dbcontext控制器需要一个参数,我不知道如何通过我的静态类。我认为创建一个新的dbcontext将解决我的范围问题下面解释,但我不明白我可以如何将选项参数传递给我的构造函数。

enter image description here

它是在Startup.cs类当前配置。 enter image description here

我的尝试: 薪火ApplicationDbContext作为论据。这适用于我的控制器中的单个方法调用,但在调用多个扩展方法时(要检查用户拥有哪个游戏帐户),我得到一个ObjectDisposedException。

ObjectDisposedException:无法访问处置的对象。造成这种错误的一个常见原因是处理从依赖注入解决的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文中调用Dispose(),或者在使用语句中包装上下文,则可能会发生这种情况。如果您正在使用依赖注入,则应该让依赖注入容器负责处理上下文实例。 对象名称:'ApplicationDbContext'。

从我的理解是一个范围问题,其中第一个方法调用处理上下文,当我试图在下一个调用中使用相同的上下文?我能做些什么来解决这个问题?

我试着读这个链接Cannot access a disposed object in ASP.NET Core when injecting DbContext但它没有帮助我,因为它需要Startup.cs类中的ApplicationBuilder。

enter image description here

解决方案更新 我设置在每一个的DbContext方法调用之后,因为我把它改成一个变量。相反,我直接调用它传递的上下文中,它的工作原理:

enter image description here

感谢大卫和Simon

+1

你是如何调用* *'HasDota2Account()'?你是否传递了一个处理过的'DbContext'? '_context'从哪里来?这个错误似乎表明它在调用'UpdateNavLinks()'之前的确处理了。所以看起来你不应该处理它,或者应该在该方法中使用本地实例化的上下文。试图共享数据上下文对象通常会导致这个问题。 – David

+0

此外,在HasDota2Account数据库是上下文相同的对象;当数据库被处置,所以上下文是。如果尝试在调用HasDota2Account之后使用上下文,它会给出相同的异常。 –

+0

我从我的第一张图片中的控制器调用它。 _context_是我的控制器上的一个字段,在构造函数中得到实例化。我不知道它是否被处置。我不认为我知道如何实例化本地_dbcontext _,因为它需要选项参数,我无法通过外部_of startup.cs_ –

回答

2

呀,所以,虽然扩展名是新的,有光泽到你,那并不意味着你应该使用他们的一切。首先,扩展应该与它们运行的​​类型有逻辑联系。例如,如果你有一个string,像ToUpper()这样的东西作为扩展是有意义的,因为它修改并返回一个字符串。就像你想要做的一样:只是使用引用的值返回完全外部类型是违反了扩展模式。

其次,扩展不应该与数据库之类的东西交互。特别是在这里,扩展的静态本质完全不符合EF上下文对象的概念。你甚至可以让它工作的唯一方法就是在扩展中每次调用扩展时都会新建一个上下文。这是一个很好的方式来搞砸EF对象跟踪的东西,以及一个很好的方式来泄漏内存。

多空,不要这样做。

如果你只是想把这些代码分解出来,你有更好的选择。例如,您实际上可以直接将方法添加到您的上下文中。

public class ApplicationDbContext : DbContext 
{ 
    ... 

    public bool HasDota2Account(string id) 
    { 
     return Dota2Accounts.Any(m => m.ApplicationUserId == id); 
    } 
} 

然后,在你的控制器,你可以简单地做:

var hasDota2Account = context.HasDota2Account(User.Identity.GetUserId()); 
+0

谢谢你的解释。每天学习新东西。 –