سؤال

عند الاتصال SaveChanges / SaveChangesAsync في Entity Framework (CF, C#)، في حالة حدوث تعارض في التغيير (على سبيل المثال، تم تحديث القيم منذ آخر قراءة)، أي من هذين الاستثناءين DbUpdateConcurrencyException أو OptimisticConcurrencyException هل يجب أن أمسك؟

وما الفرق بينهما؟

هل كانت مفيدة؟

المحلول

DbUpdateConcurrencyException هو استثناء محدد تم طرحه بواسطة DbContext, ، لذلك هذا هو الذي يجب الإمساك به.قد يكون سبب هذا الاستثناء مصدرًا أساسيًا OptimisticConcurrencyException, ، ولكن إذا كان الأمر كذلك، فسيتم تغليف هذا الاستثناء كاستثناء داخلي.

ليست كل استثناءات التحديث ناتجة عن التزامن، لذا عليك أيضًا ملاحظة ذلك DbUpdateException بعد اصطياد DbUpdateConcurrencyException (لأن الأخير هو نوع فرعي من DbUpdateException).

أنظر أيضا إطار عمل الكيان 5.0 يتعامل مع استثناء التزامن المتفائل؟.

نصائح أخرى

سوف تحصل على OptimisticConcurrencyException.القي نظرة على هذا.

الآن نأتي إلى الفرق.

  • OptimisticConcurrencyException: يتم طرحها عند حدوث انتهاك متفائل للتزامن (لنفترض أن أكثر من شخص يتغير إلى نفس النتيجة، وهذا سوف يسبب مشكلة عدم المزامنة)
  • DbUpdateConcurrencyException:تم طرح الاستثناء بواسطة DbContext عندما يكون السلوك المتوقع هو أن SaveChanges لأحد الكيانات سيؤدي إلى تحديث قاعدة البيانات ولكن في الواقع لم تتأثر أي صفوف في قاعدة البيانات.يوضح هذا أنه تم تحديث قاعدة البيانات بشكل متزامن وأن رمز التزامن الذي كان من المتوقع أن يتطابق لم يتطابق فعليًا.لا يتم إجراء تسلسل لإدخالات الحالة المشار إليها بواسطة هذا الاستثناء نظرًا للأمان وسيؤدي الوصول إلى إدخالات الحالة بعد التسلسل إلى إرجاعها فارغة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top