c# - tutorial - entity framework شرح pdf




DbEntityValidationException-كيف يمكنني معرفة سبب الخطأ؟ (6)

لدي مشروع يستخدم Entity Framework. أثناء استدعاء SaveChanges على SaveChanges الخاص بي ، أحصل على الاستثناء التالي:

System.Data.Entity.Validation.DbEntityValidationException: فشل التحقق من الصحة لواحد أو أكثر من الكيانات. راجع خاصية "EntityValidationErrors" لمزيد من التفاصيل.

هذا كل شيء جيد و dandy ، ولكن لا أريد إرفاق مصحح أخطاء في كل مرة يحدث هذا الاستثناء. أكثر من ذلك ، في بيئات الإنتاج لا أستطيع إرفاق مصحح الأخطاء بسهولة لذلك يجب أن أذهب إلى أطوال كبيرة لإعادة إنشاء هذه الأخطاء.

كيف يمكنني رؤية التفاصيل المخفية في DbEntityValidationException ؟


أعتقد أن "أخطاء التحقق من الصحة الفعلية" قد تحتوي على معلومات حساسة ، وقد يكون هذا هو سبب اختيار Microsoft لوضعها في مكان آخر (خصائص). الحل الموضح هنا هو أمر عملي ، لكن يجب أخذه بحذر.

أفضل استخدام طريقة تمديد. مزيد من الأسباب لهذا:

  • حافظ على تتبع المكدس الأصلي
  • اتبع مبدأ مفتوح / مغلق (على سبيل المثال: يمكنني استخدام رسائل مختلفة لنوع مختلف من السجلات)
  • في بيئات الإنتاج يمكن أن توجد أماكن أخرى (مثل: dbcontext أخرى) حيث يمكن طرح DbEntityValidationException.

استخدم حظر محاولة في التعليمات البرمجية الخاصة بك مثل

try
{
    // Your code...
    // Could also be before try if you know the exception occurs in SaveChanges

    context.SaveChanges();
}
catch (DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}

يمكنك التحقق من التفاصيل هنا كذلك

  1. http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/

  2. فشل التحقق من الصحة لواحد أو أكثر من الكيانات. راجع خاصية "EntityValidationErrors" لمزيد من التفاصيل

  3. http://blogs.infosupport.com/improving-dbentityvalidationexception/


عندما تكون في وضع التصحيح داخل كتلة catch {...} تفتح نافذة "QuickWatch" ( ctrl + alt + q ) وألصقها هناك:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

سيسمح لك هذا ValidationErrors شجرة ValidationErrors . إنها الطريقة الأسهل التي وجدتها للحصول على إحصاءات فورية عن هذه الأخطاء.

بالنسبة إلى مستخدمي Visual 2012+ الذين لا يهتمون إلا بالخطأ الأول وربما لا يكون لديهم حظر catch ، يمكنك حتى القيام بما يلي:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors.First().ValidationErrors.First().ErrorMessage

في الواقع ، هذه مجرد مسألة التحقق من الصحة ، سيقوم EF بالتحقق من خصائص الكيان أولاً قبل إجراء أية تغييرات على قاعدة البيانات. لذلك ، سوف تتحقق EF ما إذا كانت قيمة الخاصية خارج النطاق ، مثل عندما قمت بتصميم الجدول. Table_Column_UserName هو varchar (20). ولكن ، في EF ، قمت بإدخال قيمة أطول من 20. أو ، في حالات أخرى ، إذا كان العمود لا يسمح بأن يكون Null. لذا ، في عملية التحقق من الصحة ، يجب عليك تعيين قيمة إلى العمود غير الفارغ ، بغض النظر عما إذا كنت ستقوم بإجراء التغيير عليه. أنا شخصيا ، مثل الرد Leniel Macaferi. يمكن أن يعرض لك تفاصيل مشكلات التحقق من الصحة


لعرض مجموعة EntityValidationErrors ، أضف التعبير Watch التالي إلى إطار Watch.

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

أنا أستخدم visual studio 2013


للعثور بسرعة على رسالة خطأ ذات مغزى عن طريق فحص الخطأ أثناء تصحيح الأخطاء:

  • أضف ساعة سريعة لـ:

    ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
    
  • انتقل لأسفل إلى EntityValidationErrors مثل هذا:

    (عنصر المجموعة على سبيل المثال [0])> ValidationErrors> (عنصر المجموعة على سبيل المثال [0])> ErrorMessage





entity-framework