DVValidationException से सटीक त्रुटि प्रकार प्राप्त करना


184

मेरे पास ऐसी स्थिति है जहाँ मैं EF 4.1 के लिए DatabaseInitializer () में अपने मॉडल को इनिशियलाइज़ कर रहा हूँ और इस कष्टप्रद त्रुटि को प्राप्त करता "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details."हूँ, इसलिए, मैं इस EntityValidationErrors पर जाता हूँ और एक फ़ील्ड है {System.Data.Entity.Validation.DbEntityValidationResult}जो मुझे इस बारे में कोई जानकारी नहीं देता है कि इस क्षेत्र को प्रारंभ करने में असमर्थ था । क्या इस त्रुटि के बारे में अधिक जानकारी प्राप्त करने का कोई तरीका है?

चीजों को साफ करने के लिए:

मुझे पता है कि स्ट्रिंग की लंबाई की समस्या को कैसे ठीक किया जाए। मैं जो पूछ रहा हूं, वह सटीक फ़ील्ड नाम कैसे है जो मॉडल को तोड़ रहा है।

जवाबों:


377

जब आप catch {...}ब्लॉक में डिबग मोड में होते हैं, तो "क्विकवेच" विंडो ( ctrl+ alt+ q) खोलें और वहां पेस्ट करें:

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

यह आपको ValidationErrorsपेड़ में नीचे ड्रिल करने की अनुमति देगा । इन त्रुटियों में त्वरित जानकारी प्राप्त करना सबसे आसान तरीका है।

दृश्य 2012+ उपयोगकर्ताओं के लिए जो केवल पहली त्रुटि के बारे में परवाह करते हैं और उनमें कोई catchब्लॉक नहीं हो सकता है , आप भी कर सकते हैं:

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

9
यह अन्य उत्तर की तुलना में बेहतर है :)
डग

98
यदि आप एक कैच ब्लॉक की जरूरत नहीं है, तो आप बदल सकते हैं exके साथ $exceptionऔर एक ही परिणाम मिलता है।
18 दिसबंर को Ecyrb

यह भी सुनिश्चित करें कि आप को बदलने के exसाथ w / ई अपने catch (Exception THIS)है
Eonasdan

@Ecyrb, धन्यवाद। आपने Googling के घंटे बचाए हैं। इसके अलावा, भले ही सत्यापन त्रुटि संख्या 1 के रूप में दर्शाई गई हो, लेकिन सरणी में दो त्रुटियों वाले दो तत्व वास्तव में हैं।
मैट्रिक्स

3
System.Linq और तत्काल विंडो का उपयोग नहीं करने वालों के लिए:System.Linq.Enumerable.ToList(System.Linq.Enumerable.ToList(((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors)[0].ValidationErrors)[0].ErrorMessage
jpsimard-nyx

124

आप एक कोशिश / पकड़ ब्लॉक में यह कोशिश कर सकते हैं?

catch (DbEntityValidationException dbEx)
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
}

11

मेरी राय में सबसे अच्छा समाधान, इस तरह की त्रुटियों को केंद्रीकृत तरीके से संभालना है।

इस विधि को मुख्य DbContextवर्ग में जोड़ें:

public override int SaveChanges()
{
    try
    {
        return base.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.PropertyName + ": " + x.ErrorMessage));
        throw new DbEntityValidationException(errorMessages);
    }
}

यह आपके संदर्भ की SaveChanges()विधि को अधिलेखित कर देगा और आपको सभी इकाई सत्यापन त्रुटियों वाली अल्पविराम से अलग सूची मिल जाएगी।

आशा है कि यह उपयोगी है।


4

खैर, मुझे भी यही समस्या थी। मेरे मॉडल ने EF CTP5 में अच्छा काम किया, लेकिन 4.1 में एक ही त्रुटि के साथ निर्माण करने में विफल रहा "" सत्यापन एक या एक से अधिक संस्थाओं के लिए विफल रहा "जब मैंने इसे जन्म देने की कोशिश की। मुझे पता चला कि मेरे पास संपत्ति थी:"

public string Comment {get; set;}

फिर बीजक विधि में ओवरराइड इनिशियलाइज़र में, मैं काफी लंबी (लगभग 600 पत्र) टिप्पणी कर चुका था।

मुझे लगता है कि बात यह है: एफई 4.1 में आप है कुछ मामलों में स्पष्ट रूप से सेट डेटा एनोटेशन के लिए। मेरे लिए, सेटिंग:

[StringLength(4000)] 
public string Comment {get; set;}

मदद की। यह अजीब है क्योंकि CTP5 के साथ कोई समस्या नहीं थी।


खैर जो मैं पूछ रहा था कि मुझे सटीक संपत्ति नाम कैसे मिलता है जो मॉडल को तोड़ रहा है। हालांकि, मैं इस समस्या आप उपयोग कर कहा गया है पर काबू पाने में कामयाब [StringLength (Int32.MaxValue)] मेरी संपत्ति के लिए एक विशेषता के रूप में (के रूप में यह Ladislav Mrnka द्वारा सुझाव दिया गया था और मैं इस सवाल में यह बारे में बात की stackoverflow.com/questions/5346155/... ) पावोडजनिया! =)
नाज़

यह तब मिला जब मैंने 4.1 में अपने मॉडल में एक नई संपत्ति जोड़ी। पहले 4.1 में पूरी तरह से काम कर रहा था। अजीब। मॉडल में सभी संपत्तियों में एनोटेशन जोड़कर हल किया गया।
रॉबर्टो बोनीनी

1

मुझे एक SaveChanges आवरण बनाना उपयोगी लगा, जो EntityValidationErrors को अधिक पठनीय बनाता है:

Public Sub SaveChanges(entities As Entities)

    Try
        entities.SaveChanges()

    Catch ex As DbEntityValidationException

        Dim msg As New StringBuilder
        msg.AppendLine(ex.Message)

        For Each vr As DbEntityValidationResult In ex.EntityValidationErrors
            For Each ve As DbValidationError In vr.ValidationErrors
                msg.AppendLine(String.Format("{0}: {1}", ve.PropertyName, ve.ErrorMessage))
            Next
        Next

        Throw New DbEntityValidationException(msg.ToString, ex.EntityValidationErrors, ex)

    End Try

End Sub

और फिर मेरे पूरे प्रोजेक्ट में 'सेविंग्स.वेन्जेस ()' को 'सेवचेंजेस (एंटिटीज)' में बदल दिया


0

मुझे पता है कि यह एक पुराना सवाल है लेकिन यहाँ मेरा जवाब है:

catch (DbEntityValidationException ex)
   {
    String.Join("\n", ex.EntityValidationErrors
          .SelectMany(x => x.ValidationErrors)
          .Select(x => x.ErrorMessage)
          .ToArray());
   }

और यदि आप पहले कोड का उपयोग करते हैं, तो आप कई संसाधन फ़ाइलों का उपयोग करके अपने त्रुटि संदेशों को भी वैश्विक कर सकते हैं

उदाहरण के लिए मेरे पास ये दो अलग संसाधन फ़ाइल हैं, एक त्रुटि के लिए और एक संपत्ति के नाम के लिए और मैं उन्हें निम्नलिखित के रूप में उपयोग करता हूं: यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

public class Person 
    {
        [Required(ErrorMessageResourceName = "required",ErrorMessageResourceType =typeof(ErrorMessages))]
        [MaxLength(100,ErrorMessageResourceName = "maxLength", ErrorMessageResourceType = typeof(ErrorMessages))]
        [Display(Name = "FirstName",ResourceType = typeof(Properties))]
        public string FirstName { get; set; }
         }

जैसा कि आप देख सकते हैं कि मैंने गुणों के नामों सहित अपने त्रुटि संदेशों का पूरी तरह से अनुवाद किया है, इसलिए मैं उदाहरण के लिए बाद में उपयोगकर्ता में उनका उपयोग कर सकता हूं:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.