System.ObjectDisposedException: невозможно получить доступ к удаленному объекту. AplicationDbContext - PullRequest
0 голосов
/ 13 мая 2019

Я вызвал метод 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'.

EDIT :

Я вызываю этот метод в другом классе:

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

РЕДАКТИРОВАТЬ

Я ввожу ApplicationDbContext в Startup.cs:

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

Как мне решить?Спасибо

1 Ответ

1 голос
/ 13 мая 2019
surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList();

Вы пытаетесь использовать это вне блока использования.Сделайте это следующим образом:

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 располагается вне этого блока, как и объект запроса.

Несколько пояснений: если вы используете ядро ​​структуры сущностей, не используйте отдельное соединение dbconnection,Если вы хотите подключиться к двум разным базам данных, используйте другой DataContext.

Не открывайте Parellal Connection для одной и той же БД.Он принудительно закрывает существующее соединение.

в случае, если это та же база данных, и вы используете код первой миграции,

В DBContext class добавьте свойство DBSet<IdRilievo> и получите доступ к нему изтот же объект контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...