簡體   English   中英

刪除后立即將對象重新插入數據庫(DbLinq)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM