Строго типизированный набор данных: вставка отношений «многие ко многим» - PullRequest
1 голос
/ 30 ноября 2009

У меня есть отношение «многие ко многим» в 3 таблицах: ProgramUserGroup и Feature - это две основные таблицы, а связь между ними LinkFeatureWithProgramUserGroup где я имею отношение внешнего ключа к двум родительским таблицам.

У меня есть набор данных со вставками: я хочу добавить новую строку в ProgramUserGroup и связанную (существующую) функцию в таблицу LinkFeatureWithProgramUserGroup. При вставке новых строк я устанавливаю идентификатор по умолчанию -1:

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">   <DataSetUserGroup xmlns="http://tempuri.org/DataSetUserGroup.xsd">
<ProgramUserGroup diffgr:id="ProgramUserGroup1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
  <id>-1</id>
  <Name>99999999999</Name>
  <Active>false</Active>
</ProgramUserGroup>
<LinkFeatureWithProgramUserGroup diffgr:id="LinkFeatureWithProgramUserGroup1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
  <id>-1</id>
  <Feature_id>7</Feature_id>
  <ProgramUserGroup_id>-1</ProgramUserGroup_id>
</LinkFeatureWithProgramUserGroup>  </DataSetUserGroup> </diffgr:diffgram>

при обновлении таблиц выдается ошибка:

"Оператор INSERT конфликтовал с ограничением FOREIGN KEY" FK-LinkFeatu-Progr-7DCDAAA2 ". Конфликт произошел в базе данных" x ", таблица" dbo.ProgramUserGroup ", столбец" id "."

Код для обновления следующий:

 DataSetUserGroupTableAdapters.LinkFeatureWithProgramUserGroupTableAdapter lfa = new LinkFeatureWithProgramUserGroupTableAdapter();
 DataSetUserGroupTableAdapters.ProgramUserGroupTableAdapter pug = new ProgramUserGroupTableAdapter();

 pug.Update(dsUserGroup.ProgramUserGroup);
 lfa.Update(dsUserGroup.LinkFeatureWithProgramUserGroup);

если я проверю идентификатор новой строки таблицы ProgramUserGroup, он будет обновлен с -1 до @@ identity (например, 1099), так что все в порядке - он вставляет новую строку.

Но в таблице LinkFeatureWithProgramUserGroup соответствующее значение ProgramUserGroup.ID по-прежнему равно -1, оно все равно не обновлялось.

Как я могу также принудительно обновить ключи таблицы ссылок? Я пробовал

 pug.Update(dsUserGroup.ProgramUserGroup);
 dsUserGroup.Merge(dsUserGroup.ProgramUserGroup);
 lfa.Update(dsUserGroup.LinkFeatureWithProgramUserGroup);

Но не решил проблему: (

Спасибо

б.

1 Ответ

1 голос
/ 25 декабря 2009

Да , есть обходной путь для этого.

Вы должны указать адаптеру таблицы родительской таблицы обновить таблица данных после операции обновления. Вот как вы можете это сделать.

  1. Откройте свойства ProgramUserGroupTableAdapter -> Запрос выбора по умолчанию -> Дополнительные параметры . и отметьте опцию Обновить таблицу данных . Сохраните адаптер сейчас. Теперь при вызове update для таблицы-адаптера таблица данных будет обновлена ​​[обновлена] после операции обновления и будет отражать последние значения из таблицы базы данных. если для первичного ключа или любого столбца установлено автоматическое увеличение, таблица данных будет иметь это последнее значение после последнего обновления.

  2. Теперь вы можете вызывать обновление как pug.Update (dsUserGroup.ProgramUserGroup);

  3. Считать последние значения из столбцов ProgramUserGroup и назначить соответствующие значения в дочернюю таблицу перед обновлением . Это будет работать именно так, как вы хотите.

альтернативный текст http://ruchitsurati.net/files/tds1.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...