繁体   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