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