принудительное удаление записи ObjectStateManager при выходе из страницы - PullRequest
0 голосов
/ 12 февраля 2010

У меня есть отредактированный RESTful волшебник, основанный на Shoulders of Giants | Мастер RESTful, использующий ASP.Net MVC… Возможно? . У этого мастера есть кнопка ОТМЕНА, которая при нажатии запускает приведенный ниже код.

// If the user cancels, drop out altogether
if (!string.IsNullOrEmpty(CANCEL_BUTTON)) {
     Session.Remove(VACANCYWIZARD_SESSION_KEY);
     repository._entities.ObjectStateManager.GetObjectStateEntry(inProgressVacancyWizard.Vacancy).Delete();
     return this.RedirectToAction("Index", "Home");
}

Теперь, чтобы иметь возможность вызвать SaveChanges () после кнопки отмены, мне нужно вручную удалить запись из мастера из моего ObjectStateManager. Но когда вы отменяете мастера, просто вручную возвращаясь на домашнюю страницу, он остается на месте, и следующий вызов _entities.SaveChanges () вызовет исключение, из-за которого он не может сохранить объект, из мастера прогресса в база данных, так как она все еще находится в состоянии объекта.

Обратите внимание, что между шагами мастера я не сохраняю что-либо в базу данных. Я держу его в состоянии сеанса, извлекая его каждый шаг:

NewVacancy inProgressVacancyWizard = Session[VACANCYWIZARD_SESSION_KEY] as NewVacancy;

Как-то, однако, inProgressVacancyWizard.Vacancy действительно появляется в ObjectStateManager, поэтому я должен удалить его, иначе я получу ошибки о неполных Вакансиях моделях, пока _entities.SaveChanges () вызывается другой объект .

Есть ли способ прикрыть эту проблему?

// редактировать После некоторого чтения я обнаружил, что основы моего хранилища не хороши. Как нашли здесь . В настоящее время я сомневаюсь, чтобы реализовать параметр, упомянутый в «Один экземпляр ObjectContext на одну бизнес-транзакцию» в той же статье. Будет ли это мудрой вещью? Я хотел бы услышать больше об этом, так как это будет главный рефакторинг.

public static Repository Instance
    {
        get
        {
            if (instance == null) {
                instance = new Repository();
            }
            return instance;
        }
    }

#region Constructor: Repository()
    /// <summary>
    /// Constructor
    /// </summary>
    private Repository()
    {
        _entities = new DBModelEntitiesNew2();

    }

1 Ответ

1 голос
/ 12 февраля 2010

Похоже, вы используете один экземпляр ObjectContext для нескольких запросов. Не делай этого. Это не причинит вам ничего, кроме страданий. Это делает ваш веб-сервер с состоянием. Удалите ObjectContext после визуализации ответа (мы делаем это косвенно, начиная с Controller.Dispose), и создайте новый для следующего запроса.

...