هل يحذف الحذف من LinQ DB أيضا سجلات في جداول أخرى تحتوي على ارتباط مفاتيح أجنبي؟
-
18-09-2019 - |
سؤال
لذلك في جذر DB بلدي، لدي جدول "العميل". لدى العميل مفاتيح أجنبية ستذهب إلى حوالي 6-7 طاولات أخرى مثل الإيصالات والعناوين والمستندات وما إلى ذلك. إذا كنت لحذف عميل باستخدام Submitchanges ()، فهل سيستعرض جميع السجلات مع جمعية المفتاح الأجنبي وحذفها أيضا أو سأحتاج إلى القيام به مثل 6 استفسارات؟
المحلول
لن يحدث هذا فقط إذا قمت بإعداد جداول قاعدة البيانات الخاصة بك للقيام بذلك مع حذف متتالية (أي on delete cascade
).
لمزيد من المعلومات، يرجى الاطلاع إدراج العمليات وتحديثها وحذفها (LINQ إلى SQL):
لا يدعم LinQ إلى SQL أو التعرف على عمليات حذف Cascade. إذا كنت ترغب في حذف صف في جدول يحتوي على قيود على ذلك، فيجب عليك إما تعيين قاعدة حذف Cascade في قيد الإعداد الخارجي في قاعدة البيانات، أو استخدم الكود الخاص بك لأول مرة في حذف كائنات الطفل التي تمنع الوالد كائن من حذفه. خلاف ذلك، يتم طرح استثناء.
نصائح أخرى
أي نوع من الإجراءات التي تتسلل لديك على تلك العلاقات الرئيسية الأجنبية؟
بشكل افتراضي، لن يكون لمعظم أنظمة قاعدة البيانات (بما في ذلك SQL Server، والتي افترضت أنك تستخدمها) أي "حذف Cascade" أو أي إجراء آخر - لذلك في هذه الحالة، لن يحدث شيء.
سيوضح لك هذا الاستعلام T-SQL علاقاتك الرئيسية الخارجية وما إذا كان قد تم تحديد أي حذف أو تحديث إجراءات مرجعية أم لا:
SELECT
name 'FK Constraint',
OBJECT_NAME(parent_object_id) 'Parent table',
OBJECT_NAME(referenced_object_id) 'Referenced table',
delete_referential_action ,
delete_referential_action_desc ,
update_referential_action ,
update_referential_action_desc
FROM
sys.foreign_keys
اذا أنت يريد يحدث شيء ما، تحتاج إلى التأكد من تعيين علاقات FK هذه لاستخدام تلك الإجراءات المتتالية.
راجع مستندات MSDN قيود النزاهة المرجانية المتتالية لمزيد من التفاصيل.