gpt4 book ai didi

c# - 如何在静态类中使用 dbcontext? (对象处置异常)

转载 作者:行者123 更新时间:2023-12-01 22:20:26 25 4
gpt4 key购买 nike

嘿,我最近刚刚学会了如何使用扩展方法,并且很高兴在我当前的项目中实现它。

我的目标:我想检查辅助类中的表中是否存在条目,因为我将在多个 Controller 中使用它,以便能够确定在导航栏中显示哪些导航链接:enter image description here

我的问题:我不知道如何访问静态帮助器类中的 dbcontext。我的 dbcontext Controller 接受一个我不知道如何传递静态类的参数。我认为创建一个新的 dbcontext 可以解决下面解释的范围问题,但我不知道如何将可选参数传递给构造函数。

enter image description here

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

我尝试过的:将 ApplicationDbContext 作为参数传递。这适用于我的 Controller 中的单个方法调用,但是当调用多个扩展方法(为了检查用户拥有哪些游戏帐户)时,我得到一个 ObjectDisposeException。

ObjectDisposedException: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.Object name: 'ApplicationDbContext'.

据我了解,这是一个范围问题,第一个方法调用在完成后会处理上下文,而我试图在下一次调用中使用相同的上下文?我能做些什么来解决这个问题?

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

enter image description here

解决方案更新我在每次方法调用后都会处理 dbcontext,因为我将其放入变量中。相反,我直接在传递的上下文上调用它并且它可以工作:

enter image description here

最佳答案

是的,所以,尽管这些扩展对您来说是新的且 Shiny 的,但这并不意味着您应该将它们用于所有用途。首先,扩展应该与它们所操作的类型有逻辑连接。例如,如果您有一个 string,那么像 ToUpper() 这样的扩展就很有意义,因为它会修改并返回一个字符串。就像您想要做的那样:仅使用引用的值返回完全外来的类型违反了扩展模式。

其次,扩展不应该与数据库之类的东西交互。特别是在这里,扩展的静态性质与 EF 上下文对象的概念完全不兼容。让它工作的唯一方法是在每次调用扩展时在扩展内部创建一个上下文。这既是搞砸 EF 对象跟踪内容的好方法,也是泄漏内存的好方法。

长话短说,不要这样做。

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

public class ApplicationDbContext : DbContext
{
...

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

然后,在您的 Controller 中,您可以简单地执行以下操作:

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

关于c# - 如何在静态类中使用 dbcontext? (对象处置异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46432074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com