Linq к SQL, обратные отправки Ajax и состояние страницы в ASP.NET

StackOverflow https://stackoverflow.com/questions/822921

Вопрос

Это, должно быть, частый вопрос, но, похоже, пока не на SO.Я использую Linq to SQL для приложения, которое допускает различные изменения данных в моей модели в памяти, и затем изменения будут помещены в очередь для асинхронной обработки.Итак, я не беспокоюсь об обновлениях (пока).Изменения в различные части данных могут быть внесены с помощью модальных всплывающих окон на веб-странице.Некоторые из них основаны на сетке, другие - это просто атрибуты.Я сталкиваюсь с проблемой, связанной с изменениями, не выдерживающими циклов обратной передачи.Очевидно, что я не хочу ничего сохранять в базе данных до тех пор, пока не будут внесены все изменения и пользователь не отправит страницу.

Маршрут, который я выбрал до сих пор, таков:

  • Я отключил отложенную загрузку
  • Я создаю [сериализуемый] частичный класс для моего корневого объекта
  • Я помещаю эту вещь в сеанс и извлекаю ее в событии onload

Кажется, это работает в принципе.Однако, когда я пытаюсь обновить некоторые дочерние свойства после извлечения объекта из сеанса

p.PhysicianSpecialties[0].physician_specialty_code = 
    ddlSpecialty.SelectedItem.Value;

Я получаю эту ошибку:

Operation is not valid due to the current state of the object.

Ошибка вызвана вызовом этого метода в сгенерированном методе установки Linq:

this.SendPropertyChanging();

Другие свойства обновляются просто отлично:

p.PhysicianNames[0].first_name = txtFirstName.Text.ToUpper();

Это не приводит к ошибке.

Мои вопросы:Неужели я в корне ошибаюсь?Есть ли лучший способ сделать это?Что вызывает ошибку?

Обновить:Исключением является 'System.Data.Linq.Исключение ForeignKeyReferenceAlreadyHasValueException'.Я думаю, что Я кое-что нащупал, но я пока не знаю решения.

Это было полезно?

Решение

Я получил решение из MSDN.Проблема есть, и это объясняется лучше в этой теме чем я могу это сделать, что нельзя изменить ассоциацию в одностороннем порядке, но нужно сделать это с обоих концов, назначив новый дочерний объект, а не просто изменив идентификатор:

p.PhysicianSpecialties[0].PhysicianSpecialtyLookup = db.PhysicianSpecialtyLookups.Одиночный (c => (c.physician_specialty_code == ddlSpecialty.Выбранный элемент.Значение));

Другие советы

И как это можно сделать, если использовать привязку данных?У меня есть выпадающий список в представлении таблицы данных, который начал выдавать эту ошибку при изменении выпадающего значения.Это заставляет меня думать, что я должен либо удалить ассоциацию, либо не использовать привязку данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top