[英]Object is reinserted into database immediately after delete (DbLinq)
我有一個MySql數據庫,其一般結構如下所示:
Manufacturer <== ProbeDefinition <== ImagingSettings
ElementSettings ====^ ^==== ProbeInstance
我正在使用InnoDB允許外鍵,並且所有指向ProbeDefinition
外鍵都設置為ON DELETE CASCADE
。
我遇到的問題是刪除代碼中的ProbeDefinition
時,會立即將其重新插入。 級聯刪除正確發生,因此其他表被清除了,但是似乎LINQ to SQL可能無緣無故地發送了一個插入。 檢查數據庫的ChangeSet屬性顯示1個刪除,沒有插入。
我正在使用以下少量代碼來執行刪除操作:
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();
MySql中的日志顯示了運行該命令時正在執行的以下命令:
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
列表填充ListBox之后發生。
在以下代碼段運行之前和之后,我嘗試運行上述刪除代碼:
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()
事實證明,當對對象有多個引用時,就會出現問題。 逐步查看DbLinq源代碼,我了解到完成DELETE
后,它將逐步遍歷所有其他“監視”的對象,以查找引用。
在這種情況下,我通過表database.ProbeDefinition
以及制造商參考manufacturer.ProbeDefinition
商maker.ProbeDefinition具有多個引用。 在我通過這兩種方法訪問對象之前,這不是問題。 使用Remove
可以從制造商DeleteOnSubmit
刪除引用,使用DeleteOnSubmit
可以從表中刪除對象。 如果我做一個或另一個,另一個引用仍然存在,因此該對象被標記為要重新插入。 我不確定這是否是DbLinq中的錯誤,它不會刪除其他引用或預期行為。
無論哪種方式,在我的情況下,解決方案都是僅使用一種方法訪問表,然后使用該方法刪除,或者使用兩種方法刪除。 為了使它起作用,我使用了第二種方法:
// Delete probe
this.manufacturer.ProbeDefinition.Remove(probe);
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();
編輯:在對該項目和類似問題進行進一步的工作后,我發現了實施的真正根本問題。 我有一個長期存在的DataContext,並且通過緩存如何工作(使SubmitChanges起作用),您不能這樣做。 真正的解決方案是使用短暫的DataContext,然后使用每種方法重新連接到數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.