对象被删除(的DBLinq)后立即重新插入到数据库
-
23-09-2019 - |
题
我有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 */
编辑:在进一步的测试,似乎我已经填充的列表框与ProbeDefinition
s名单后这只是发生
我试图运行上面删除代码之前和下面的代码片断已经用完之后:
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,并重新连接到在每个方法的数据库。