gpt4 book ai didi

c# - 删除后对象立即重新插入数据库(DbLinq)

转载 作者:行者123 更新时间:2023-11-29 15:05:41 25 4
gpt4 key购买 nike

我有一个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 获得了多个引用。在我通过这两种方法访问对象之前,这不是问题。使用Remove可以从制造商中删除引用,使用DeleteOnSubmit将从表中删除该对象。如果我执行其中之一,则另一个引用仍然存在,因此该对象被标记为要重新插入。我不确定这是否是 DbLinq 中的一个错误,它不会删除其他引用或预期行为。

无论哪种方式,就我而言,解决方案是仅使用一种方法访问表,然后使用该方法删除,或者使用两种方法删除。为了让它正常工作,我使用了第二种方法:

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

编辑:在对项目和类似问题进行进一步研究后,我发现了我的实现的真正根本问题。我有一个长期存在的 DataContext,并且根据缓存的工作原理(使 SubmitChanges 工作),您无法执行此操作。 真正的解决方案是拥有一个短暂的 DataContext,并在每个方法中重新连接到数据库。

关于c# - 删除后对象立即重新插入数据库(DbLinq),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2157746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com