#data-binding #ado.net #dataset #cascade #strongly-typed-dataset
#привязка данных #ado.net #набор данных #каскад #strongly-typed-dataset
Вопрос:
Типизированные наборы данных в ADO.Предполагается, что Net может выполнять каскадные удаления и обновления, когда устанавливается связь данных между двумя таблицами, скажем, родительской и дочерней. Однако я не смог заставить это работать. Я должен уточнить: это работает для меня в памяти; но это не сохраняется в базе данных.
Я настроил тестовый проект с двумя таблицами в моей базе данных: Цвета и поля. У каждого есть первичный ключ ID и имя (например, «BoxId, BoxName»). Цвета — это родительский элемент и поля Boxes, в котором также есть поле ColorID, помеченное ограничением внешнего ключа. Затем я настроил Winform с двумя DataGridViews на нем, по одному для каждой таблицы. Я перетащил две таблицы в новый набор данных, и их взаимосвязь появилась в конструкторе. Я отредактировал связь, чтобы она была «Как внешним ключом, так и отношением», и установил для всех 3 параметров ссылочной целостности значение «Каскад» (т. Е. DeleteRule, UpdateRule, AcceptRejectChanges). Я также создал DeleteCommand для таблицы Boxes, потому что по какой-то причине разработчик отказался это сделать. Наконец, я помещаю кнопку рядом с каждой таблицей для сохранения и помещаю вызов Update () в обработчик событий для каждого (например this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);
)
Когда я запускаю форму и профилировщик SQL, я вижу все свои данные, и я могу без проблем удалять элементы в дочерних элементах (блоках). Эти удаления также приводят к удалению в базе данных. Excelente.
Когда я выполняю удаление в верхней сетке (Цвета), строка, которую я удалил, исчезает, и строки в сетке блоков также исчезают (при условии, что я НЕ ПРОВЕРЯЮ ограничение FK в базе данных). Это выглядит великолепно. Однако в профилировщике, очевидно, выполнялась только инструкция удаления цветов. Строки полей потеряны. Вы не увидите этого в Winform, пока не перезапустите приложение, и в этот момент удаляемые строки в полях отображаются с красным значком восклицания слева от них, указывая, что они нарушают ограничение FK.
Это сводит с ума, потому что, похоже, мой единственный вариант здесь — самостоятельно закодировать материал ссылочной целостности, например, используя сохраненную процедуру для выполнения удаления цветов (внутри которой я бы также удалил поля), или упорядочить КАСКАДНОЕ УДАЛЕНИЕ на сервере SQL, или даже поместить встроенные удаления полей в инструкцию удаления цветов. Я продолжаю возвращаться к тому факту, что объект DataRelation в моей модели должен обрабатывать это за меня. Очевидно, что объекты BindingSource получают это, поскольку они удаляют соответствующие строки из дочерней таблицы. Но почему модель сначала не выполняет удаления в таблице Boxes, а затем в таблице Colors?
Ответ №1:
Удаление строк в наборе данных только пометит их для удаления в вашем наборе данных; вам все равно придется использовать табличный адаптер для каждой таблицы в базе данных, из которой вы хотите удалить данные. Вы можете рассматривать набор данных как свою версию базы данных в памяти. Эти изменения должны быть внесены в базу данных в правильном порядке, чтобы предотвратить ошибки FK. В вашем случае вам необходимо выполнить инструкцию update для родительской таблицы (colors) ПОСЛЕ того, как все удаления для дочерних таблиц (блоков) были зафиксированы следующим образом…
this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);
this.colorsTableAdapter.Update(this.pOCDataSet.Colors);
Надеюсь, это поможет.