ডিবিভালিডেশনএক্সেপশন থেকে সঠিক ত্রুটি টাইপ করা


184

আমার এমন পরিস্থিতি রয়েছে যেখানে আমি EF 4.1 এর জন্য "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details."ডেটাবেসআইনিটিয়ালাইজার () -তে আমার মডেলটি আরম্ভ করছি এবং এই বিরক্তিকর ত্রুটিটি পেয়েছি তাই, আমি এই এনটিটিভিডিয়েশন এরিয়ার্সে চলেছি এবং এমন একটি ক্ষেত্র রয়েছে {System.Data.Entity.Validation.DbEntityValidationResult}যা আমাকে কোন ক্ষেত্রটি শুরু করতে অক্ষম ছিল সে সম্পর্কে কোনও তথ্য দেয় না all । এই ত্রুটি সম্পর্কে আরও তথ্য পাওয়ার কোনও উপায় আছে কি?

বিষয়গুলি পরিষ্কার করতে:

আমি জানি স্ট্রিংয়ের দৈর্ঘ্যের সমস্যাটি কীভাবে ঠিক করা যায়। আমি যা জিজ্ঞাসা করছি তা হল আমি সঠিক ক্ষেত্রের নামটি কীভাবে পেতে পারি যা মডেলটি ভেঙে চলেছে।

উত্তর:


377

আপনি মধ্যে ডিবাগ মোডে হলেও catch {...}ব্লক "QuickWatch" উইন্ডো খুলুন ( ctrl+ + alt+ + q) এবং সেখানে আটকান:

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

এটি আপনাকে ValidationErrorsগাছের মধ্যে ড্রিল করতে দেয় । এই ত্রুটিগুলির মধ্যে তাত্ক্ষণিক অন্তর্দৃষ্টি পাওয়া এটি সবচেয়ে সহজ উপায়।

ভিজ্যুয়াল ২০১২++ ব্যবহারকারীদের জন্য যারা কেবল প্রথম ত্রুটিটি সম্পর্কে চিন্তা করেন এবং এর কোনও catchব্লক নাও থাকতে পারে , আপনি এমনকি এটি করতে পারেন:

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

9
এটি অন্য উত্তরের চেয়ে ভাল :)
ডগ

98
আপনার যদি ক্যাচ ব্লক না থাকে তবে আপনি এটির exসাথে প্রতিস্থাপন করতে পারেন $exceptionএবং একই ফলাফল পেতে পারেন ।
Ecyrb

এছাড়াও নিশ্চিত করুন যে আপনি প্রতিস্থাপন exসঙ্গে W / E আপনার catch (Exception THIS)হয়
Eonasdan

@ এসিরব, ধন্যবাদ আপনি গুগলিংয়ের কয়েক ঘন্টা সঞ্চয় করেছেন। এছাড়াও, বৈধতা ত্রুটি গণনাটি 1 হিসাবে দেখানো হলেও, অ্যারেতে দুটি ত্রুটি সহ আসলে দুটি উপাদান রয়েছে।
ম্যাট্রিক্স

3
যারা সিস্টেমকে রেফারেন্স দিচ্ছেন না। লিঙ্ক এবং তাত্ক্ষণিক উইন্ডো ব্যবহার করছেন: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

ঠিক আছে, আমারও একই সমস্যা ছিল। আমার মডেল ইএফ সিটিপি 5 তে ভাল কাজ করেছে তবে 4.1 সালে একই ত্রুটি দিয়ে তৈরি করতে ব্যর্থ হয়েছিল যখন "আমি এটি ইনালিটিাইজ করার চেষ্টা করলাম তখন" "এক বা একাধিক সত্তার জন্য বৈধতা ব্যর্থ হয়েছিল" I আমি বুঝতে পেরেছিলাম যে আমার সম্পত্তি আছে:

public string Comment {get; set;}

তারপরে ওভাররাইড ইনিশিয়ালাইজারে বীজ পদ্ধতিতে আমার বেশ কিছুটা দীর্ঘ (প্রায় 600 অক্ষর) মন্তব্য ছিল।

আমি মনে করি বিন্দু: মতিন 4.1 আপনি আছে কিছু ক্ষেত্রে স্পষ্টভাবে সেট ডেটার টীকা করতে। আমার জন্য, সেটিংস:

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

সাহায্য করেছিল। এটি অদ্ভুত যেহেতু সিটিপি 5 এর সাথে কোনও সমস্যা ছিল না।


ভাল আমি যা জিজ্ঞাসা করছিলাম তা হল আমি কীভাবে সঠিক সম্পত্তির নাম পাই যা মডেলটি ভেঙে যাচ্ছে। যদিও, আমি সমস্যা আপনি ব্যবহার বিবৃত পরাস্ত পরিচালিত [StringLength (Int32.MaxValue)] আমার সম্পত্তি জন্য একটি বৈশিষ্ট্য হিসাবে (যেমন Ladislav Mrnka দ্বারা প্রস্তাব ছিল এবং আমি এই প্রশ্নে এটি সম্পর্কে বললাম stackoverflow.com/questions/5346155/... ) পাওডজেনিয়া! =)
নাজ

৪.১-এ যখন আমি আমার মডেলটিতে একটি নতুন সম্পত্তি যুক্ত করেছি তখন তা ছুঁড়ে যায়। 4.1 এর আগে পুরোপুরি কাজ করছিল working রহস্যময়। মডেলের সমস্ত বৈশিষ্ট্যে টিকা যুক্ত করে সমাধান করা।
রবার্তো বনিনি

1

আমি একটি সেভচেন্জেস মোড়ক তৈরির জন্য দরকারী বলে মনে করেছি যা সত্তাবিধ্বননীয় ত্রুটিগুলি আরও পঠনযোগ্য করে তোলে:

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; }
         }

আপনি দেখতে পাচ্ছেন যে সম্পত্তিগুলির নাম সহ আমি আমার ত্রুটি বার্তাগুলি সম্পূর্ণরূপে অনুবাদ করেছি, তাই আমি পরে এটি ব্যবহারকারীর মধ্যে ব্যবহার করতে পারলাম:

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.