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

问题描述 投票:0回答:3

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

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

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

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY"))
                .ServiceLifetime.Singleton);

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

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

所以我将设置更改为:

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY"))
                .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));

现在我面临着

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);
        }
}

在我的控制器中:

  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);
                }
            

这是我的 ViewModel:

 public class UserModelView
    {
        public TblXXX tblXXX { get; set; }
        public List<TblXXX > tblXXXList { get; set; }
    }
          

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

c# database entity-framework asp.net-core dependency-injection
3个回答
16
投票

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


6
投票

在 ASP.NET Core 中,DbContext 应该是一个 Scoped 服务,而不是 Singleton。

更改此:

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY"))
                .ServiceLifetime.Singleton);

services.AddDbContext<XXX>
                (option => 
                option.UseSqlServer(Configuration.GetConnectionString("YYY")));

0
投票

我在方法中使用

_context.Dispose()
时遇到此问题,通过删除并查看代码解决了它。

© www.soinside.com 2019 - 2024. All rights reserved.