Типизированные наборы данных в 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 получают его, так как они удаляют соответствующие строки из дочерней сетки.Но почему модель сначала не выполняет удаление из таблицы «Ящики», а затем из таблицы «Цвета»?