System.ObjectDisposedException:无法访问已处置的对象。 AplicationDbContext

时间:2019-05-13 13:43:17

标签: c# .net asp.net-core .net-core

我调用GetSurveysAuditorByUserEmail方法。此方法连接到另一个远程数据库并返回记录。

public SurveysService(ApplicationDbContext context) {
  _context = context;
}

public IList<Survey> GetSurveysAuditorByUserEmail(string email) {
  var idsSurveys = new List<string>( );
  var surveys = new List<Survey>( );
  try {
    using(IDbConnection db = new SqlConnection(_connStringAudit)) {
      idsSurveys = db.Query<string>("Select (CONVERT(nvarchar(450), Id) + Funz) as IdRilievo From V_TemView Where Email = @email",
        new { email }).ToList( );

    }

    surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList( );
  }
  catch (Exception e) {
    _logger.Write(e.Message);
  }

  return surveys;
}

surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList();行上出现错误:

  

System.ObjectDisposedException:无法访问已处置的对象。一种   导致此错误的常见原因是处理已解决的上下文   从依赖注入,然后稍后尝试使用相同的   应用程序中其他位置的上下文实例。这可能是你   在上下文上调用Dispose()或将上下文包装在   使用语句。如果使用依赖注入,则应让   依赖项注入容器负责处理上下文   实例。对象名称:“ ApplicationDbContext”。

编辑

我在另一个类中调用此方法:

public async Task<List<IGrouping<int, Survey>>> GroupSurveyByIntervId(User user) {
  IList<Survey> surveys = new List<Survey>( );
  var statuses = _context.Statuses.ToList( );
  //var surv = _context.Surveys.ToList();

  var userRoles = await _userManager.GetRolesAsync(user);

  surveys = _surveysService.GetSurveysAuditorByUserEmail(user.Email);

  var groupSurv = surveys.GroupBy(x => x.InterventionId).ToList( );
  return groupSurv;
}

编辑

我在Startup.cs中注入ApplicationDbContext:

services.AddDbContext<ApplicationDbContext>(options =>
  options.UseSqlServer(
    Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<TrackingUser, TrackingRole>(options => {
    options.SignIn.RequireConfirmedEmail = false;
  })
  .AddEntityFrameworkStores<ApplicationDbContext>( );

我该如何解决?谢谢

1 个答案:

答案 0 :(得分:1)

surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList();

您正在尝试在using块之外使用它。 这样做

using (IDbConnection db = new SqlConnection(_connStringAudit))
{
    idsSurveys = db.Query<string>("Select (CONVERT(nvarchar(450), Id) + Funz) as IdRilievo From V_TemView Where Email = @email",
                      new { email }).ToList();
    surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList();
}

db放置在using块之外,查询对象也放置在

很少有说明:如果您使用的是实体框架核心,请不要使用单独的dbconnection。 如果要连接到两个不同的数据库,请使用不同的DataContext。

请勿打开与同一数据库的Parellal连接。它迫使现有连接关闭。

如果是同一数据库,并且您正在使用代码优先迁移,

DBContext类中添加DBSet<IdRilievo>属性,并从同一上下文对象访问它。

相关问题