يتم إعادة إدخال الكائن في قاعدة البيانات مباشرة بعد الحذف (DBLINQ)
-
23-09-2019 - |
سؤال
لدي قاعدة بيانات MySQL ، التي يبدو أن هيكلها العام هكذا:
Manufacturer <== ProbeDefinition <== ImagingSettings
ElementSettings ====^ ^==== ProbeInstance
أنا أستخدم InnoDB للسماح بمفاتيح أجنبية ، وجميع المفاتيح الأجنبية تشير إلى أ ProbeDefinition
لقد حددت ON DELETE CASCADE
.
المشكلة التي أواجهها هي عندما أحذف أ ProbeDefinition
في الكود الخاص بي ، يتم إعادة إدخاله على الفور. يحدث الحذف المتتالي بشكل صحيح حتى يتم مسح الجداول الأخرى ، ولكن يبدو أن LINQ إلى SQL قد ترسل إدراجًا دون سبب. يُظهر التحقق من خاصية تغييرات على قاعدة البيانات 1 حذفًا ، ولا توجد إدراج.
أنا أستخدم الجزء الصغير التالي من التعليمات البرمجية لتنفيذ الحذف:
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();
سجلات في MySQL تظهر الأوامر التالية التي يتم تنفيذها عند تشغيل هذا:
BEGIN
use `wetscoprobes`; DELETE FROM wetscoprobes.probedefinition WHERE ID = 10
use `wetscoprobes`; INSERT INTO wetscoprobes.probedefinition (CenterFrequency, Elements, ID, IsPhased, ManufacturerID, Name, Pitch, Radius, ReverseElements) VALUES (9500000, 128, 10, 1, 6, 'Super Probe 2', 300, 0, 1)
COMMIT /* xid=2424 */
ما الذي يمكن أن يسبب هذا غير ضروري INSERT
؟ لاحظ أن حذف أ Manufacturer
بنفس الطريقة التي يتم بها حذف بشكل صحيح ، مع السجل التالي:
BEGIN
use `wetscoprobes`; DELETE FROM wetscoprobes.manufacturer WHERE ID = 9
COMMIT /* xid=2668 */
يحرر: عند إجراء مزيد من الاختبارات ، يبدو أن هذا يحدث فقط بعد أن قمت بسكان صندوق القائمة مع قائمة من ProbeDefinition
س.
حاولت تشغيل رمز الحذف أعلاه قبل وبعد تشغيل المقتطف التالي:
var manufacturer = (Manufacturer)cbxManufacturer.SelectedItem;
var probes = manufacturer.ProbeDefinition;
foreach (var probe in probes)
{
cbxProbeModel.Items.Add(probe);
}
يتم حذف الكائن بشكل صحيح قبل تشغيل الكود المذكور ، ولكن في أي وقت بعد هذه النقطة ، فإنه يؤدي إدراجًا بعد الحذف. ألا يعجبه حقيقة أن الكائن مشار إليه في مكان ما؟
إليك الرمز الذي أقوم بتشغيله لاختبار حذف تعريف من النافذة المتوسطة:
database.ProbeDefinition.DeleteOnSubmit(database.ProbeDefinition.Last())
database.SubmitChanges()
المحلول
تبين أن هناك مشكلات عندما تكون هناك مراجع متعددة إلى كائنك. في صعود مصدر DBLINQ ، تعلمت ذلك بعد أ DELETE
تم الانتهاء منه ، وهو يخطو من خلال جميع الكائنات "المراقبة" الأخرى ، وتبحث عن المراجع.
في هذه الحالة ، لدي مراجع متعددة من خلال الجدول database.ProbeDefinition
وكذلك من خلال مرجع الشركة المصنعة ، manufacturer.ProbeDefinition
. هذه ليست مشكلة حتى أتمكن من الوصول إلى الكائنات من خلال كلتا الطريقتين. استخدام Remove
يمكن حذف المرجع من الشركة المصنعة ، باستخدام DeleteOnSubmit
سوف يحذف الكائن من الجدول. إذا قمت بعمل واحد أو آخر ، فلا يزال هناك إشارة أخرى ، وبالتالي يتم تمييز الكائن ليتم إعادة إدراجه. لست متأكدًا مما إذا كان هذا خطأ في dblinq أنه لا يحذف مراجع أخرى ، أو السلوك المتوقع.
في كلتا الحالتين ، في حالتي ، يتمثل الحل إما في الوصول إلى الجدول باستخدام طريقة واحدة فقط ، وحذفها باستخدام هذه الطريقة ، أو للحذف باستخدام كلتا الطريقتين. من أجل تشغيلها ، استخدمت الطريقة الثانية:
// Delete probe
this.manufacturer.ProbeDefinition.Remove(probe);
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();
تعديل: عند مزيد من العمل في المشروع وقضايا مماثلة ، وجدت القضية الأساسية الحقيقية لتنفيذي. لدي datacontext منذ فترة طويلة ، وكيفية عمل التخزين المؤقت (لجعل Mitchanges Submithanges) ، لا يمكنك القيام بذلك. ال حقا الحل هو أن يكون لديك datacontext قصيرة العمر ، وإعادة الاتصال إلى قاعدة البيانات في كل طريقة.