2009-08-25 72 views
6

我使用ADO.NET在C#(.NET 3.5)強類型數據集。我想插入一個新的行到兩個相關的1:n關係表。插入行使用強類型DataSet

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表中。爲什麼?

我該如何解決這個問題?

+0

只是一個筆記......當我使用強類型數據集時,每次實例化時都會有巨大的性能。 – Zoidberg 2009-08-25 12:54:33

+0

是的,我知道這一點。你用什麼來代替?簡單地鍵入DataSets? – 2009-08-25 12:56:33

+0

@Manuel:您的強類型數據集與我在asp.net項目數據集中找到的數據集相同,因爲您有自動生成的表格adpaters或者您是否手動創建它們? – Breadtruck 2009-08-25 13:08:44

回答

4

在表之間的關係,確保「兩個關係和外鍵約束」被選中,「更新規則」設置爲「級聯」。結合適配器上的「刷新數據表」選項,插入父行後,更新的ID將「關聯」到關係中,從而防止數據集中的外鍵違規行爲。然後您的子表將準備好正確插入數據庫。

1

有些事情嘗試:

在配置TableAdapter的,你點擊高級選項,並檢查「刷新數據表」,以便它將檢索標識列值?

對我來說,有時我要麼忘了檢查它,或者它沒有正確保存配置,因爲我並沒有因爲種種原因,我的表標識增量/結實。你在桌上使用身份增量嗎?

你也可以考慮只是重新創建這兩個表的適配器。

通常當我回去了一切,我覺得這是我的一部分了一些愚蠢的。

最後,你可能會考慮在主表上調用update,然後手動抓住主鍵值,並手動設置值,當你插入子記錄。如果這沒有意義,請告訴我,我將發佈代碼。

0

你需要告訴你的父表的表適配器更新操作後刷新 數據表。 這是你如何做到的。 >默認選擇查詢 - - 的ProgramUserGroupTableAdapter

  1. 打開屬性> Advnaced選項。並檢查選項刷新數據表。現在保存適配器。現在,當您調用表適配器上的更新時,數據表將在更新操作後更新[刷新],並將反映數據庫表中的最新值。 如果主鍵或任何色彩設置爲自動遞增,則數據表將在最近更新後具有最新值。

  2. 現在你可以調用更新爲pug.Update(dsUserGroup.ProgramUserGroup);

  3. 從程序用戶組顏色中讀取最新值並在更新之前將相應的值分配到子表中。這將按照你想要的方式工作。

alt text http://ruchitsurati.net/files/tds1.png