У меня есть база данных MySql, чья общая структура выглядит следующим образом:Объект повторно в базу данных сразу после удаления (DbLinq)
Manufacturer <== ProbeDefinition <== ImagingSettings
ElementSettings ====^ ^==== ProbeInstance
Я использую InnoDB, чтобы внешние ключи, и все внешние ключи, указывающие на a 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 */
Edit: После дальнейшего тестирования, кажется, что это происходит только после того, как я заселена в 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()
Если другая таблица удаляется просто отлично, она, скорее всего, будет иметь какое-то отношение к вашим настройкам в таблице ProbeDefinition в дизайне LinqToSql. Можете ли вы предоставить эти настройки? –
Я не использовал конструктор LinqToSql, а классы были сгенерированы с использованием DbMetal.exe, снабженного DbLinq, и я был подключен в коде. Оглядываясь на сгенерированные определения из DbMetal, я не вижу никакого кода, связанного с удалением ... –
@NickLarsen: я обновил вопрос с некоторыми дополнительными выводами, в частности, что только после того, как существующие ссылки на объект удаляют также выполнить вставку. –