我有MySQL数据库,其一般结构如下所示:

Manufacturer <== ProbeDefinition <== ImagingSettings
  ElementSettings  ====^ ^==== ProbeInstance

我使用的是InnoDB允许外国键,并指向ProbeDefinition所有外键都设置ON DELETE CASCADE

我遇到的问题是,当我删除我的代码ProbeDefinition,它就会立即重新插入。该级联删除发生妥善所谓其他表都被清零,但似乎LINQ to SQL的可能发送无缘无故地插入。检查在数据库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 */ 

编辑:在进一步的测试,似乎我已经填充的列表框与ProbeDefinitions名单后这只是发生

我试图运行上面删除代码之前和下面的代码片断已经用完之后:

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,并重新连接到在每个方法的数据库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top