无法访问已处置的上下文实例 EF core

Par*_*iri 5 c# database entity-framework dependency-injection asp.net-core

我正在通过 .net core mvc 和 EF 开发一个 CRM,它需要大量的数据库连接来检索和更新信息。我在调试过程中时不时会遇到这个错误,这是一个有很多用户的大项目,我不知道它在实际使用中会如何工作!

无法访问已释放的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。\r\n对象名称:“XXX”。

在我在startup.cs中使用此设置之前:

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY"))
                .ServiceLifetime.Singleton);
Run Code Online (Sandbox Code Playgroud)

该设置偶尔会导致另一个错误:

System.InvalidOperationException:无法跟踪实体类型“TblZZZ”的实例,因为已跟踪具有相同键值 {'ZZZId'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

所以我将我的设置更改为:

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY"))
                .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
Run Code Online (Sandbox Code Playgroud)

现在我面临着Cannot access a disposed context instance。我不知道什么设置可以解决我的问题。

我用的是net5.0

更新:我的部分课程:

public partial class TblXXX
    {
        private ZZZ context;//context
        public TblXXX(ZZZ _context)
        {
            context = _context;
        }
        public TblXXX() { }
//function for check username
   public bool CheckUsernameExit(string username) {
            var u = context.TblXXX
                .Where(e => e.Username == username)
                .FirstOrDefault();
            return (u != null);
        }
}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中:

  public IActionResult Check(UserModelView user)
        {
            if (ModelState.IsValid)
            {
                var r = _viewModel.tblXXX.CheckUsernameExit(user.tblXXX.Username);
                if (r)
                {
                    toastNotification.AddErrorToastMessage("This email is in use. Enter differernt email.");
                 
                    return View("Create", _viewModel);
                }
            
Run Code Online (Sandbox Code Playgroud)

这是我的视图模型:

 public class UserModelView
    {
        public TblXXX tblXXX { get; set; }
        public List<TblXXX > tblXXXList { get; set; }
    }
          
Run Code Online (Sandbox Code Playgroud)

这是我遇到错误的情况之一。

Jus*_*son 18

我收到此错误是因为我没有在控制器方法内的方法上使用等待。这导致函数在调用完成之前返回并处置上下文。

在此输入图像描述


Dav*_*oft 8

在 asp.net core 中,DbContext 应该是一个 Scoped 服务,而不是 Singleton。

改变这个:

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY"))
                .ServiceLifetime.Singleton);
Run Code Online (Sandbox Code Playgroud)

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY")));
Run Code Online (Sandbox Code Playgroud)