2010-09-14 41 views
3

我是一位有DAO和SQL Server的noob,當我嘗試插入時遇到問題值分成兩個有關係的表。表Photos具有gpsId字段,該字段與GPSLocations表的id字段具有外鍵關係。我想創建鏈接到一個新的GPSLocation新照片的條目,所以代碼看起來是這樣的:嘗試進行分層更新會導致錯誤「無法插入外鍵值」

gpsRow = dataset.GPSLocations.AddGPSLocationsRow("0.0N", "3.2W"); 
dataset.Photos.AddPhotosRow(@"c:\path\file.jpg", gpsRow); 
tableAdapterManager.UpdateAll(dataset); 

然而這會導致以下錯誤:

A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = photoToGps ]

我使用SQL Server CE。我的理解是正確的,TableAdapterManager應該處理這個分層更新?我只是將這些表拖到XSD視圖上,並依靠其自動創建包裝類。我是否需要改變關係的任何內容(例如使其成爲外鍵約束)?我注意到,在某些情況下,gps編號是正面的,有時是負面的,是相關的嗎?

編輯: 我也確保更新屬性設置爲CASCADE,這會導致相同的錯誤。分層更新設置爲true,設計器中的兩個表之間存在外鍵約束。

+0

也許我們需要更多信息。我假設GPSLocations表中的第三個字段是id字段並被標記爲主鍵。有沒有理由不是身份領域?爲什麼照片沒有id字段(可能與您的問題無關,我只是想更多地瞭解該模式)。 – 2010-09-22 04:40:30

+0

對不起,第三個字段是誤導性的,所以我刪除了它,它只是一個數據成員,而不是一個身份。 GPSLocations表有一個標識列'id'(也是主鍵),它與'Photos'表的'gpsId'列有關係 – 2010-09-22 21:08:56

回答

2

我已經設法追查到這個問題的根源,歸結爲與完整的SQL Server相比SQL Server CE的侷限性。事實證明,有些事情不對的主要暗示是因爲IDs是負面的。在行插入到數據庫之前,DataSet中的id爲負數,此時它將被解析爲正數索引。事實上,它沒有成爲一個積極的指數發生,因爲TableAdapterManager通常會執行一個批次聲明INSERT後跟一個SELECT更新id。但是,SQL Server CE不支持批處理語句,因此需要編寫額外的代碼,以便通過響應RowUpdated事件來模擬SELECT步驟。這個MSDN article解釋了步驟。

+0

有趣。我不知道在LINQ To SQL和Entity Framework中是否存在相同的問題,它們是Microsoft自己的DataSets替代品。 – 2010-09-28 06:37:02

0

由於列photoToGps(外鍵)取決於主鍵(id),因此除非存在相應的ID,否則無法添加photoToGps。所以你需要的是個人更新,而不是做一個UpdateAll。首先更新GPSLocations表格,然後更新另一個表格。這樣,在爲其添加photoToGPS之前,您將擁有一個ID。

+0

謝謝,但是我在嘗試TableAdapterManager之前曾嘗試過,我認爲這應該是假設的處理這種更新的地方有一個關係,這意味着必須先更新一個表。 – 2010-09-20 11:28:02

1

您是否按照here所述啓用了分層更新?

+0

謝謝,我會試試 – 2010-09-21 13:12:02

+0

是的,它已被設置爲真 - 這是VS2008中的默認設置 – 2010-09-21 21:42:21

1

這兩個表之間是否存在外鍵約束(在連接它們的XSD設計器上應該有一行)?由於您的字段命名不同,因此在將表格拖動到設計圖面時可能未自動添加。

+0

是的,存在外鍵約束。我已經嘗試了XSD設計器中的不同選項來啓用約束或關係。我得到相同的結果。 – 2010-09-21 13:12:54

3

這只是您的數據集的配置。雙擊Visual Studio的數據集設計器中的表格之間的關係,選擇關係和外部關鍵約束選項和在更新規則字段選擇級聯選項和那必須是它。

關於此主題的一些信息在MSDN中,您可以在這裏查看http://msdn.microsoft.com/en-us/library/bb629317.aspx並轉到相關主題。

+0

正如我在對ktharsis的迴應中所提及的那樣,在我的編輯中,我已經啓用了外鍵約束,並且更新規則被設置爲級聯。 – 2010-09-24 13:17:22

+2

你說在那裏你嘗試了不同的選擇,但我不知道你已經嘗試過這個。只是「Foreigh Key Constraint」不起作用。必須確切地將「關係和外部關鍵約束」都與更新規則「級聯」結合在一起。我剛剛嘗試過,它工作。也許這是因爲你使用的是SQL Server CE,而我正在使用MS SQL 2008 Developer Edition。 – 2010-09-24 13:25:58

+0

我現在發現,這是SQL Server CE和完整的SQL Server之間的區別 - 請參閱我自己的回答 – 2010-09-27 21:27:48