Вставка строк в отношениях с использованием строго типизированного набора данных - PullRequest
6 голосов
/ 25 августа 2009

Я использую ADO.NET со строго типизированным набором данных в C # (.NET 3.5).Я хочу вставить новую строку в две таблицы, которые связаны отношением 1: n.

Таблица Attachments содержит часть отношения первичного ключа, а таблица LicenseAttachments содержит часть внешнего ключа..

AttachmentsDataSet.InvoiceRow invoice; // Set to a valid row, also referenced in InvoiceAttachments
AttachmentsDataSet.AttachmentsRow attachment;
attachment = attachmentsDataSet.Attachments.AddAttachmentsRow("Name", "Description");
attachmentsDataSet.InvoiceAttachments.AddInvoiceAttachmentsRow(invoice, attachment);

Конечно, когда я впервые обновлю таблицу InvoicesAttachments, я получу нарушение внешнего ключа от сервера SQL, поэтому я попытался сначала обновить таблицу Attachments, что создастстрок, но удалит связь вложений в таблице InvoiceAttachments.Почему?

Как мне решить эту проблему?

Ответы [ 3 ]

4 голосов
/ 08 мая 2010

В отношении между таблицами убедитесь, что выбрано «Связывание и ограничение внешнего ключа», а «Правило обновления» установлено на «Каскад». В сочетании с параметром «Обновить таблицу данных» на адаптере после вставки родительской строки обновленный идентификатор будет «каскадировать» отношения, предотвращая нарушения внешнего ключа в вашем наборе данных. Ваши дочерние таблицы будут готовы для правильной вставки в базу данных.

1 голос
/ 25 августа 2009

Некоторые вещи попробовать:

Когда вы настраивали адаптер таблицы, нажимали ли вы на дополнительные параметры и проверяли «обновить таблицу данных», чтобы она получала значение столбца идентификаторов?

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

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

Обычно, когда я возвращаюсь ко всему, я нахожу что-то глупое с моей стороны.

Наконец, вы можете рассмотреть возможность вызова update для таблицы Primary, затем вручную получить значение первичного ключа и вручную установить значение при вставке дочерней записи. Если это не имеет смысла, дайте мне знать, и я отправлю код.

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

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

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

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

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

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

...