一般的な構造が次のような MySql データベースがあります。
Manufacturer <== ProbeDefinition <== ImagingSettings
ElementSettings ====^ ^==== ProbeInstance
外部キーを許可するために InnoDB を使用してProbeDefinition
いますON DELETE CASCADE
。
私が抱えている問題はProbeDefinition
、コードで a を削除すると、すぐに再挿入されることです。カスケード削除は適切に行われるため、他のテーブルはクリアされますが、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
aをまったく同じ方法で削除すると、次のログで正しく削除されることに注意してください。
BEGIN
use `wetscoprobes`; DELETE FROM wetscoprobes.manufacturer WHERE ID = 9
COMMIT /* xid=2668 */
編集:さらにテストすると、これは ListBox に のリストを入力した後にのみ発生するようですProbeDefinition
。
次のスニペットが実行される前後に、上記の削除コードを実行してみました。
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()