ObjectDisposedException выбрасывается каждый раз, когда объект «Пользователь» (членство) обновляется - PullRequest
0 голосов
/ 11 июля 2011
  • Я использую asp.net mvc 3, инфраструктуру сущностей с структурной картой для IoC.
  • У меня есть свой собственный поставщик членства.
  • У меня была такая же проблема, когда я внедрял объект dbcontext и экземпляры членства, используя StructureMap, поэтому удалил это для моего UserRepository.
  • У UserRepository теперь есть свойство DBContext, которое инициализируется в конструкторе.

Каждый раз, когда создается / обновляется новый пользователь (метод, который делает это, оборачивает объект dbcontext в оператор using), в следующий раз при обращении к dbcontext я получу исключение ObjectDisposedException.

Я не понимаю, что я делаю неправильно.Очевидно, что класс провайдера членства не создает экземпляр объекта userRepository каждый раз, когда он ему нужен, и когда пользователь обновляется, контекст удаляется из-за оператора using.Но я думал, что это стандартная практика?

Любая помощь очень ценится.

РЕДАКТИРОВАНИЕ:

На самом деле сложного кода не существует.Настройка:

CustomMembershipProvider переопределяет стандартного поставщика членства (файл конфигурации содержит подробности).CustomMembershipProvider использует объект IUserService, который использует IUserRepository, который реализован UserRepository, который имеет частный объект DBContext на уровне класса.

В UserRepository у меня есть:

    public void UpdateUser(User user)
    {
        using(_db)
        {
            ... code to indicate that the user state has changed
            _db.SaveChanges();
        }
    }

Как только этот кодзапустить, запрос завершен.Но когда делается другой запрос, чтобы получить информацию о роли или прочитать пользователя из базы данных (в классе UserRepository), я получаю исключение ObjectDisposedException.На данный момент ничего, связанного с пользователем или ролью, не работает, потому что они используют тот же класс UserRepository, чья переменная _db была удалена UpdateUser.

У меня изначально было StructureMap для разрешения объекта DBContext, объекта customMembership и т. Д., Но с тех порудалите его из отображения StructureMap.

1 Ответ

3 голосов
/ 11 июля 2011

Каждый раз, когда новый пользователь создано / обновлено (метод делает это оборачивает объект dbcontext в используя утверждение), в следующий раз ссылка на dbcontext я получаю ObjectDisposedException выброшено.

DbContext - это доступный ресурс (который реализует IDisposable). Поэтому, когда вы заключаете его в блок using, контекст располагается , когда поток управления выходит из блока using.

using(myContext)
{
   //do stuff
}

//try to access myContext after the using block throw ObjectDisposedException

Вы должны изменить дизайн того, как вы используете DbContext и когда вы собираетесь его использовать.

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