オブジェクトが再挿入した後は速やかにデータベースの削除(DbLinq)
-
23-09-2019 - |
質問
私はMySqlデータベースに、一般の構造は以下のようなものです:
Manufacturer <== ProbeDefinition <== ImagingSettings
ElementSettings ====^ ^==== ProbeInstance
私が使っているInnoDBを外部キーは、すべての外部キーを指さし、 ProbeDefinition
設定してい ON DELETE CASCADE
.
のんするのがとても楽しみでしたの削除 ProbeDefinition
私のコードは、行動の便が良いことから、すぐにreinserted.のカスケードの削除うになるようにしてくださいその他のテーブルをクリアするようで、商品が送を挿入しない理由です。チェチェンジセット物件のデータベース表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 */
編集: さらに試験がうことのみがついた人口は、ListBoxの 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
が完了した後、それを参照するために探して、他のすべての「見て」オブジェクトを通してのステップということを学びました。
ここで、Iはdatabase.ProbeDefinition
、テーブルmanufacturer.ProbeDefinition
介して、並びに製造業者の参照を介して複数の参照を持っています。私は両方の方法でオブジェクトにアクセスしたまで、これは問題ではありません。 Remove
を使用して、テーブルからオブジェクトを削除しますDeleteOnSubmit
を使用して、製造元からの参照を削除することができます。私はどちらか一方を行う場合は、他の参照がまだ存在するので、オブジェクトが再挿入されるようにマークされています。これは、それは削除しないで他の参照、または期待される動作を行うことDbLinqのバグである場合、私はわからない。
いずれにせよ、私の場合、溶液は、その方法を使用して、または両方の方法を使用して削除する単一の方法を使用して、削除のいずれかでアクセスするテーブルです。それは働いて得ることのために、私は2番目の方法を使用します:
// Delete probe
this.manufacturer.ProbeDefinition.Remove(probe);
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();
の編集:のプロジェクトと同様の問題に関するさらなる作業の際に、私は私の実装の本当の根本的な問題を発見しました。私は長寿命のDataContextを持ち、作品をキャッシュする方法と(でSubmitChangesを機能させるために)、あなたがこれを行うことはできません。 の本当ののソリューションを持っているそれぞれの方法でデータベースにDataContextの、および再接続を短くし、住んでいます。