2009-05-05 2 views
1

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

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

  • Я отключил отложенные загрузки
  • создать [сериализуемый] частичный класс для моего корневого объекта
  • Я положил вещи в сессию и извлечение его в событии 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». Я думаю, I am on to something, но пока не знаю решения.

ответ

2

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

p.PhysicianSpecialties [0] .PhysicianSpecialtyLookup = db.PhysicianSpecialtyLookups.Single (с => (c.physician_specialty_code == ddlSpecialty.SelectedItem.Value));

0

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

+0

Что вы связываете с выпадающим списком? – cdonner