2010-01-28 11 views
0

我有一個MySQL數據庫,它的基本結構是這樣的:對象重新插入到數據庫中刪除後立即(的DBLinq)

Manufacturer <== ProbeDefinition <== ImagingSettings 
    ElementSettings ====^ ^==== ProbeInstance 

我使用的是InnoDB允許外國鍵,所有的外鍵指向ProbeDefinition已設置ON DELETE CASCADE

我遇到的問題是當我在代碼中刪除ProbeDefinition時,它立即重新插入。級聯刪除正常發生,所以其他表被清除,但似乎LINQ to SQL可能無故發送插入。檢查數據庫上的ChangeSet屬性顯示1刪除,並且沒有插入。

我使用下面的代碼的小位執行刪除操作:在MySQL

database.ProbeDefinition.DeleteOnSubmit(probe); 
database.SubmitChanges(); 

日誌顯示正在執行以下命令時,這是運行:

BEGIN 
use `wetscoprobes`; DELETE FROM wetscoprobes.probedefinition WHERE ID = 10 
use `wetscoprobes`; INSERT INTO wetscoprobes.probedefinition (CenterFrequency, Elements, ID, IsPhased, ManufacturerID, Name, Pitch, Radius, ReverseElements) VALUES (9500000, 128, 10, 1, 6, 'Super Probe 2', 300, 0, 1) 
COMMIT /* xid=2424 */ 

這是什麼原因這不必要INSERT?請注意,在完全相同的方式刪除Manufacturer刪除正確,用下面的日誌:

BEGIN 
use `wetscoprobes`; DELETE FROM wetscoprobes.manufacturer WHERE ID = 9 
COMMIT /* xid=2668 */ 

編輯:經過進一步的測試,似乎我已經填充的列表框與列表後,這只是發生ProbeDefinition s。

我嘗試過運行上面刪除代碼後下面的代碼片段已經運行:

var manufacturer = (Manufacturer)cbxManufacturer.SelectedItem; 
var probes = manufacturer.ProbeDefinition; 

foreach (var probe in probes) 
{ 
    cbxProbeModel.Items.Add(probe); 
} 

對象被刪除正確表示代碼運行,不過這點之後的任何時間,它後執行插入前刪除。它不喜歡這個對象被引用的事實嗎?

這裏是我運行,以測試從中間窗口刪除定義代碼:

database.ProbeDefinition.DeleteOnSubmit(database.ProbeDefinition.Last()) 
database.SubmitChanges() 
+0

如果另一個表正在被刪除,那麼很可能與您在LinqToSql設計器的ProbeDefinition表上的設置有關。你能提供這些設置嗎? – 2010-01-28 20:41:51

+0

我沒有使用LinqToSql設計器,而是使用DbLinq提供的DbMetal.exe生成類,並且我使用代碼連接。查看從DbMetal生成的定義,我沒有看到任何代碼相關的刪除... – 2010-01-28 20:47:22

+0

@NickLarsen:我已經更新了一些更多的調查結果的問題,特別是只有在現有的對象引用後刪除也執行插入。 – 2010-01-28 21:55:49

回答

1

原來,有些時候有你的對象多個引用的問題。通過DbLinq源代碼,我瞭解到在DELETE完成後,它遍歷所有其他「監視」對象,查找參考。

在這種情況下,我通過表database.ProbeDefinition以及通過製造商參考manufacturer.ProbeDefinition多次引用。直到我通過兩種方法訪問對象之前,這都不是問題。使用Remove可以從製造商刪除引用,使用DeleteOnSubmit將從表中刪除該對象。如果我這樣做或另一個,另一個引用仍然存在,因此該對象被標記爲重新插入。我不確定這是否是DbLinq中的一個錯誤,它不會刪除其他引用或預期的行爲。

無論哪種方式,在我的情況下,解決方案是要麼只使用一種方法訪問表,要麼使用該方法進行刪除,要麼使用這兩種方法進行刪除。爲了得到它的工作的緣故,我用的是第二種方法:

// Delete probe 
this.manufacturer.ProbeDefinition.Remove(probe); 
database.ProbeDefinition.DeleteOnSubmit(probe); 
database.SubmitChanges(); 

編輯:在對項目和類似的問題開展進一步的工作,我發現我實現真正的根本性問題。我有一個長壽命的DataContext,以及緩存如何工作(使SubmitChanges工作),你不能這樣做。 真正的解決方案是有一個短命的DataContext,並重新連接到每個方法中的數據庫。

相關問題