У меня есть база данных 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 */
Редактировать: После дальнейшего тестирования кажется, что это происходит только после того, как я заполнил 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()