Linq к SQL, обратные отправки Ajax и состояние страницы в ASP.NET
-
03-07-2019 - |
Вопрос
Это, должно быть, частый вопрос, но, похоже, пока не на 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.Выбранный элемент.Значение));
Другие советы
И как это можно сделать, если использовать привязку данных?У меня есть выпадающий список в представлении таблицы данных, который начал выдавать эту ошибку при изменении выпадающего значения.Это заставляет меня думать, что я должен либо удалить ассоциацию, либо не использовать привязку данных.