Каскадные удаления не сохраняются в базе данных в моем наборе типизированных данных - PullRequest
0 голосов
/ 27 апреля 2011

Типизированные наборы данных в ADO.Net должны иметь возможность каскадного удаления и обновления, когда DataRelation устанавливается между двумя таблицами, скажем, родительским и дочерним.Однако я не смог заставить это работать.Я должен уточнить: это работает для меня в памяти;но он не сохраняется в базе данных.

Я создал тестовый проект с двумя таблицами в моей базе данных: Colors и Boxes.У каждого есть первичный ключ ID и имя (например, «BoxId, BoxName»).Цвета - это родитель и Box, которые также имеют поле ColorId, помеченное ограничением внешнего ключа.Затем я настроил Winform с двумя DataGridViews, по одному для каждой таблицы.Я перетащил две таблицы в новый набор данных, и их связь появилась в конструкторе.Я отредактировал отношение так, чтобы оно было «И внешний ключ, и отношение», и я установил все 3 параметра ссылочной целостности на «Каскад» (т. Е. DeleteRule, UpdateRule, AcceptRejectChanges).Я также создал DeleteCommand для таблицы Boxes, потому что дизайнер почему-то отказался это сделать.Наконец, я помещаю кнопку рядом с каждой сеткой для сохранения и помещаю вызов Update () в обработчик событий для каждого (например, this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);)

Когда я запускаю форму и SQL Profiler, я вижу всемои данные, и я могу удалить элементы в ребенка (коробки) без проблем.Эти удаления генерируют DELETE в базе данных, а также.Excelente.

Когда я делаю удаление в верхней сетке (Цвета), удаляемая строка исчезает, и строки (я) в сетке Boxes также исчезают (при условии, что я УТВЕРЖДАЮ ограничение FK в базе данных),Это выглядит великолепно.Однако в профилировщике явно выполнялся только оператор Colors DELETE.Строки (ящики) осиротели.Вы не увидите этого в Winform, пока не перезапустите приложение, и в этот момент потенциальные удаленные строки в полях появятся с красным восклицательным значком слева от них, указывая, что они нарушают ограничение FK.

Это сводит с ума, потому что это, кажется, кажется, что мой единственный вариант здесь - это самому кодировать элементы ссылочной целостности, используя хранимый процесс для выполнения удаления цветов (внутри которого я бы также сделал удаление ящиков), или упорядочение ON DELETE.CASCADE на SQL Server или даже вставка встроенных блоков удаляет в операторе Colors delete.Я продолжаю возвращаться к тому факту, что объект DataRelation в моей модели должен обрабатывать это для меня.Очевидно, что объекты BindingSource получают его, так как они удаляют соответствующие строки из дочерней сетки.Но почему модель сначала не выполняет удаление из таблицы «Ящики», а затем из таблицы «Цвета»?

1 Ответ

0 голосов
/ 18 октября 2011

Удаление строк в наборе данных пометит их только для удаления в вашем наборе данных; вам все равно придется использовать адаптер таблицы для каждой таблицы в БД, из которой вы хотите удалить данные. Вы можете думать о наборе данных как о своей версии базы данных в памяти. Эти изменения должны быть зафиксированы в базе данных в правильном порядке, чтобы предотвратить ошибки FK. В вашем случае вам нужно запустить оператор обновления для родительской таблицы (цвета) ПОСЛЕ того, как все удаления для дочерних элементов (блоков) были зафиксированы следующим образом ...

this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);
this.colorsTableAdapter.Update(this.pOCDataSet.Colors);

Надеюсь, это поможет.

...