يتم إعادة إدخال الكائن في قاعدة البيانات مباشرة بعد الحذف (DBLINQ)

StackOverflow https://stackoverflow.com/questions/2157746

  •  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 قصيرة العمر ، وإعادة الاتصال إلى قاعدة البيانات في كل طريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top