У меня есть страница, где я использую два элемента управления ASP DetailsView
для визуализации данных из двух разных, но связанных, LinqDataSource
объектов. Моя основная таблица представлена в первом наборе DetailsView / LinqDataSource, и я использую встроенную функцию обновления LinqDataSource для сохранения изменений, когда DetailsView находится в режиме редактирования. Первичная таблица здесь представляет сущность «Контакт» (то есть лицо или организацию и их контактную информацию).
Второй DetailsView отображает данные из таблицы перекрестных ссылок, которая связывает контакт с одним или несколькими «тегами». Определения тегов взяты из другой таблицы, поэтому таблица перекрестных ссылок просто связывает идентификатор контакта с идентификатором тега; стандартный сценарий типа «многие ко многим».
У меня обновления Tag Xref работают правильно; когда теги добавляются или удаляются из контакта, соответствующие строки вставляются или удаляются из таблицы внешних ссылок. Это достигается не через LinqDataSource, а путем обработки события ItemUpdating
для тегов DetailsView и использования DataContext для ручной обработки вставок и удалений.
Таким образом, контакт и теги контакта могут обновляться индивидуально. Проблема в том, что мне нужно обновить контакт и теги Xref, чтобы они произошли вместе в одной транзакции. У меня есть два элемента управления DetailsView, связанных, так что когда пользователь нажимает «Обновить» для первого элемента управления, он запускает обновление для второго. Но первый DetailsView использует связанный LinqDataSource для обновления, который имеет свой собственный DataContext. Попытки «поделиться» DataContext между моим ручным обновлением и результатом LinqDataSource приводят к исключениям ObjectDisposed.
Я чувствую, что упускаю что-то очевидное. Совместное использование объектов DataContext кажется скользким уклоном. Есть ли способ запустить транзакцию на странице, которая будет включать обе операции?