Каскадните изтривания не се запазват в базата данни в моя въведен набор от данни

Предполага се, че въведените набори от данни в ADO.Net могат да каскадно изтриват и актуализират, когато DataRelation е настроен между две таблици, да речем родител и дете. Въпреки това не успях да накарам това да работи. Трябва да изясня: работи за мен в паметта; но не се запазва в базата данни.

Настроих тестов проект с две таблици в моята база данни: Цветове и Кутии. Всеки има ID първичен ключ и име (напр. "BoxId, BoxName"). Colors е родител и Boxes, който също има поле ColorId, маркирано с ограничение за външен ключ. След това настроих Winform с два DataGridView върху него, по един за всяка таблица. Преместих двете таблици в нов набор от данни и връзката им се появи в дизайнера. Редактирах връзката да бъде „Както външен ключ, така и връзка“ и зададох всичките 3 опции за референтна цялост на „Каскада“ (т.е. DeleteRule, UpdateRule, AcceptRejectChanges). Също така създадох DeleteCommand за таблицата Boxes, защото по някаква причина дизайнерът отказа да го направи. Накрая поставям бутон до всяка решетка за запазване и поставям извикване Update() в манипулатора на събития за всяка (напр. this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);)

Когато стартирам формуляра и SQL Profiler, виждам всичките си данни и мога да изтрия елементи в дъщерния (кутии) без проблем. Тези изтривания генерират DELETE и в базата данни. Отлично.

Когато направя изтриване в горната решетка (Цветове), редът, който съм изтрил, изчезва и редът(овете) в решетката с кутии също изчезват (ако приемем, че НЕ ПРОВЕРИХ ограничението FK в базата данни). Това изглежда страхотно. Въпреки това, в профилиращия, очевидно се изпълнява само командата Colors DELETE. Редовете с кутии са осиротели. Не виждате това в Winform, освен ако не рестартирате приложението, в който момент потенциално изтритите редове в Boxes се появяват с червена удивителна икона отляво, което показва, че нарушават FK ограничението.

Това е вбесяващо, защото със сигурност изглежда, че единствената ми опция тук е сам да кодирам нещата за референтната цялост, а ла, използвайки съхранена процедура за извършване на изтриване на цветове (вътре в което също бих направил изтриването на кутиите) или нареждане НА ИЗТРИВАНЕ CASCADE на SQL Server или дори поставяне на вградени полета за изтриване в командата за изтриване на цветове. Продължавам да се връщам към факта, че обектът DataRelation в моя модел трябва да се справи с това вместо мен. Ясно е, че обектите BindingSource го получават, тъй като премахват съответните редове от дъщерната мрежа. Но защо моделът първо не извършва изтривания спрямо таблицата Boxes и след това таблицата Colors?


person Mike K    schedule 27.04.2011    source източник


Отговори (1)


Изтриването на редове в набор от данни ще ги маркира само за изтриване във вашия набор от данни; все още трябва да използвате адаптер за таблица за всяка таблица в DB, ​​от която искате да изтриете данни. Можете да мислите за набора от данни като за вашата версия на базата данни в паметта. Тези промени трябва да бъдат ангажирани в базата данни в правилния ред, за да се предотвратят FK грешки. Във вашия случай трябва да изпълните израза за актуализиране за родителската таблица (цветове), СЛЕД като всички изтривания за дъщерните (кутии) са били ангажирани така...

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

Надявам се това да помогне.

person Carter Medlin    schedule 17.10.2011