簡體   English   中英

System.ObjectDisposedException:無法訪問已處置的對象。 AplicationDbContext

[英]System.ObjectDisposedException: Cannot access a disposed object. AplicationDbContext

我調用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()或將上下文包裝在using語句中時,可能會發生這種情況。 如果使用依賴項注入,則應讓依賴項注入容器負責處理上下文實例。 對象名稱:“ 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>( );

我該如何解決? 謝謝

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>屬性,並從同一上下文對象訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM