এক বা একাধিক সত্তার জন্য বৈধতা ব্যর্থ হয়েছে। আরও তথ্যের জন্য 'সত্তাবিশেষকরণের ত্রুটি' সম্পত্তি দেখুন


804

কোডটি প্রথম পদ্ধতির সাথে আমার ডাটাবেসটি সিড করার সময় আমার এই ত্রুটি হচ্ছে।

এক বা একাধিক সত্তার জন্য বৈধতা ব্যর্থ হয়েছে। আরও তথ্যের জন্য 'সত্তাবিশেষকরণের ত্রুটি' সম্পত্তি দেখুন।

সত্যি কথা বলতে কীভাবে বৈধতা ত্রুটির বিষয়বস্তু চেক করতে হয় তা আমি জানি না। ভিজ্যুয়াল স্টুডিও আমাকে দেখায় যে এটি 8 টি অবজেক্ট সহ একটি অ্যারে, তাই 8 বৈধতা ত্রুটি।

এটি আমার আগের মডেলটির সাথে কাজ করছিল, তবে আমি কয়েকটি পরিবর্তন করেছি যা আমি নীচে ব্যাখ্যা করছি:

  • আমার স্ট্যাটাস নামে একটি এনাম ছিল, আমি এটিকে স্ট্যাটাস নামক শ্রেণিতে পরিবর্তন করেছি
  • আমি ক্লাস আবেদনকারীদের পজিশন ইতিহাসটি পরিবর্তন করে একই টেবিলে 2 টি বিদেশী কী রাখতে পারি

দীর্ঘ কোডের জন্য আমাকে ক্ষমা করুন, তবে আমি এটি সব পেস্ট করতে হবে। ব্যতিক্রমটি নিম্নলিখিত কোডের শেষ লাইনে ফেলে দেওয়া হয়েছে।

namespace Data.Model
{  
    public class Position
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]   
        public int PositionID { get; set; }

        [Required(ErrorMessage = "Position name is required.")]
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
        [Display(Name = "Position name")]              
        public string name { get; set; }

        [Required(ErrorMessage = "Number of years is required")] 
        [Display(Name = "Number of years")]        
        public int yearsExperienceRequired { get; set; }

        public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
    }

    public class Applicant
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]      
        public int ApplicantID { get; set; }

        [Required(ErrorMessage = "Name is required")] 
        [StringLength(20, MinimumLength = 3, ErrorMessage="Name should not be longer than 20 characters.")]
        [Display(Name = "First and LastName")]
        public string name { get; set; }

        [Required(ErrorMessage = "Telephone number is required")] 
        [StringLength(10, MinimumLength = 3, ErrorMessage = "Telephone should not be longer than 20 characters.")]
        [Display(Name = "Telephone Number")]
        public string telephone { get; set; }

        [Required(ErrorMessage = "Skype username is required")] 
        [StringLength(10, MinimumLength = 3, ErrorMessage = "Skype user should not be longer than 20 characters.")]
        [Display(Name = "Skype Username")]
        public string skypeuser { get; set; }

        public byte[] photo { get; set; }

        public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
    }

    public class ApplicantPosition
    {
        [Key]
        [Column("ApplicantID", Order = 0)]
        public int ApplicantID { get; set; }

        [Key]
        [Column("PositionID", Order = 1)]
        public int PositionID { get; set; }

        public virtual Position Position { get; set; }

        public virtual Applicant Applicant { get; set; }

        [Required(ErrorMessage = "Applied date is required")] 
        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date applied")]     
        public DateTime appliedDate { get; set; }

        [Column("StatusID", Order = 0)]
        public int StatusID { get; set; }

        public Status CurrentStatus { get; set; }

        //[NotMapped]
        //public int numberOfApplicantsApplied
        //{
        //    get
        //    {
        //        int query =
        //             (from ap in Position
        //              where ap.Status == (int)Status.Applied
        //              select ap
        //                  ).Count();
        //        return query;
        //    }
        //}
    }

    public class Address
    {
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Country should not be longer than 20 characters.")]
        public string Country { get; set; }

        [StringLength(20, MinimumLength = 3, ErrorMessage = "City  should not be longer than 20 characters.")]
        public string City { get; set; }

        [StringLength(50, MinimumLength = 3, ErrorMessage = "Address  should not be longer than 50 characters.")]
        [Display(Name = "Address Line 1")]     
        public string AddressLine1 { get; set; }

        [Display(Name = "Address Line 2")]
        public string AddressLine2 { get; set; }   
    }

    public class ApplicationPositionHistory
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
        public int ApplicationPositionHistoryID { get; set; }

        public ApplicantPosition applicantPosition { get; set; }

        [Column("oldStatusID")]
        public int oldStatusID { get; set; }

        [Column("newStatusID")]
        public int newStatusID { get; set; }

        public Status oldStatus { get; set; }

        public Status newStatus { get; set; }

        [StringLength(500, MinimumLength = 3, ErrorMessage = "Comments  should not be longer than 500 characters.")]
        [Display(Name = "Comments")]
        public string comments { get; set; }

        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date")]     
        public DateTime dateModified { get; set; }
    }

    public class Status
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
        public int StatusID { get; set; }

        [StringLength(20, MinimumLength = 3, ErrorMessage = "Status  should not be longer than 20 characters.")]
        [Display(Name = "Status")]
        public string status { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.IO;

namespace Data.Model
{
    public class HRContextInitializer : DropCreateDatabaseAlways<HRContext>
    {
        protected override void Seed(HRContext context)
        {
            #region Status
            Status applied = new Status() { status = "Applied" };
            Status reviewedByHR = new Status() { status = "Reviewed By HR" };
            Status approvedByHR = new Status() { status = "Approved by HR" };
            Status rejectedByHR = new Status() { status = "Rejected by HR" };
            Status assignedToTechnicalDepartment = new Status() { status = "Assigned to Technical Department" };
            Status approvedByTechnicalDepartment = new Status() { status = "Approved by Technical Department" };
            Status rejectedByTechnicalDepartment = new Status() { status = "Rejected by Technical Department" };

            Status assignedToGeneralManager = new Status() { status = "Assigned to General Manager" };
            Status approvedByGeneralManager = new Status() { status = "Approved by General Manager" };
            Status rejectedByGeneralManager = new Status() { status = "Rejected by General Manager" };

            context.Status.Add(applied);
            context.Status.Add(reviewedByHR);
            context.Status.Add(approvedByHR);
            context.Status.Add(rejectedByHR);
            context.Status.Add(assignedToTechnicalDepartment);
            context.Status.Add(approvedByTechnicalDepartment);
            context.Status.Add(rejectedByTechnicalDepartment);
            context.Status.Add(assignedToGeneralManager);
            context.Status.Add(approvedByGeneralManager);
            context.Status.Add(rejectedByGeneralManager); 
            #endregion    

            #region Position
            Position netdeveloper = new Position() { name = ".net developer", yearsExperienceRequired = 5 };
            Position javadeveloper = new Position() { name = "java developer", yearsExperienceRequired = 5 };
            context.Positions.Add(netdeveloper);
            context.Positions.Add(javadeveloper); 
            #endregion

            #region Applicants
            Applicant luis = new Applicant()
            {
                name = "Luis",
                skypeuser = "le.valencia",
                telephone = "0491732825",
                photo = File.ReadAllBytes(@"C:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\1.jpg")
            };

            Applicant john = new Applicant()
            {
                name = "John",
                skypeuser = "jo.valencia",
                telephone = "3435343543",
                photo = File.ReadAllBytes(@"C:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\2.jpg")
            };

            context.Applicants.Add(luis);
            context.Applicants.Add(john); 
            #endregion

            #region ApplicantsPositions
            ApplicantPosition appicantposition = new ApplicantPosition()
            {
                Applicant = luis,
                Position = netdeveloper,
                appliedDate = DateTime.Today,
                StatusID = 1
            };

            ApplicantPosition appicantposition2 = new ApplicantPosition()
            {
                Applicant = john,
                Position = javadeveloper,
                appliedDate = DateTime.Today,
                StatusID = 1
            };        

            context.ApplicantsPositions.Add(appicantposition);            
            context.ApplicantsPositions.Add(appicantposition2); 
            #endregion

            context.SaveChanges(); --->> Error here
        }
    }
}

উত্তর:


1237

সত্যি কথা বলতে কীভাবে বৈধতা ত্রুটির বিষয়বস্তু চেক করতে হয় তা আমি জানি না। ভিজ্যুয়াল স্টুডিও আমাকে দেখায় যে এটি 8 টি অবজেক্ট সহ একটি অ্যারে, তাই 8 বৈধতা ত্রুটি।

আসলে আপনি ত্রুটিগুলি দেখতে হবে যদি আপনি ডিবাগের সময় ভিজ্যুয়াল স্টুডিওতে সেই অ্যারেটিতে ড্রিল করেন। তবে আপনি ব্যতিক্রমটি ধরে ফেলতে পারেন এবং তারপরে কিছু লগিং স্টোর বা কনসোলে ত্রুটিগুলি লিখতে পারেন:

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

EntityValidationErrorsএমন একটি সংগ্রহ যা সত্তাগুলির প্রতিনিধিত্ব করে যা সফলভাবে যাচাই করা যায়নি, এবং ValidationErrorsসত্তা প্রতি অভ্যন্তরীণ সংগ্রহ সম্পত্তি স্তরের ত্রুটির তালিকা।

এই বৈধতা বার্তাগুলি সাধারণত সমস্যার উত্স খুঁজে পেতে যথেষ্ট সহায়ক।

সম্পাদন করা

কয়েকটি সামান্য উন্নতি:

মান আপত্তিকর সম্পত্তির তাই মত ভেতরের লুপ মধ্যে অন্তর্ভুক্ত করা যেতে পারে:

        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                ve.PropertyName,
                eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),
                ve.ErrorMessage);
        }

যদিও এটি সমস্ত ধরণের অ্যাপ্লিকেশনগুলিতে কাজ Debug.Writeকরে Console.WriteLineততই ডিবাগ করা ভাল ।

যে ওয়েব অ্যাপ্লিকেশনগুলি উত্পাদিত রয়েছে এবং যেগুলি ব্যতীত লগিংয়ের জন্য এলমা ব্যবহার করে এটির জন্য আমার পক্ষে একটি কাস্টম ব্যতিক্রম তৈরি করা এবং SaveChangesনতুন এই ব্যতিক্রমটি ছুঁড়ে ফেলতে ওভাররাইট করা আমার পক্ষে খুব কার্যকর ।

কাস্টম ব্যতিক্রম প্রকারটি এর মতো দেখাচ্ছে:

public class FormattedDbEntityValidationException : Exception
{
    public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
        base(null, innerException)
    {
    }

    public override string Message
    {
        get
        {
            var innerException = InnerException as DbEntityValidationException;
            if (innerException != null)
            {
                StringBuilder sb = new StringBuilder();

                sb.AppendLine();
                sb.AppendLine();
                foreach (var eve in innerException.EntityValidationErrors)
                {
                    sb.AppendLine(string.Format("- Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().FullName, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                            ve.PropertyName,
                            eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),
                            ve.ErrorMessage));
                    }
                }
                sb.AppendLine();

                return sb.ToString();
            }

            return base.Message;
        }
    }
}

এবং SaveChangesনিম্নলিখিত ভাবে ওভাররাইট করা যায়:

public class MyContext : DbContext
{
    // ...

    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            var newException = new FormattedDbEntityValidationException(e);
            throw newException;
        }
    }
}

কয়েকটি মন্তব্য:

  • হলুদ ত্রুটি পর্দা যা এলমা ওয়েব ইন্টারফেসে বা প্রেরিত ইমেলগুলিতে দেখায় (যদি আপনি এটি কনফিগার করেছেন) এখন বার্তাটির শীর্ষে সরাসরি বৈধতার বিবরণ প্রদর্শন করে।

  • ওভাররাইটিংয়ের Messageপরিবর্তে কাস্টম ব্যতিক্রমে সম্পত্তিটি ওভাররাইটিংয়ের ToString()ফলে সুবিধাটি পাওয়া যায় যে মানক এএসপি.নেট "মৃত্যুর হলুদ স্ক্রিন (ওয়াইএসওডি)" এই বার্তাটিও প্রদর্শন করে। এলমার বিপরীতে ওয়াইএসড দৃশ্যত ব্যবহার করে না ToString(), তবে উভয়ই Messageসম্পত্তি প্রদর্শন করে display

  • আসল DbEntityValidationExceptionঅভ্যন্তরীণ ব্যতিক্রম হিসাবে মূল মোড়ানো নিশ্চিত করে যে মূল স্ট্যাক ট্রেসটি এখনও পাওয়া যাবে এবং এটি এলমা এবং ওয়াইএসডে প্রদর্শিত হবে।

  • লাইনে ব্রেকআপপয়েন্ট সেট করে throw newException;আপনি কেবল newException.Messageবৈধতা সংগ্রহগুলিতে ড্রিলিংয়ের পরিবর্তে সম্পত্তিটি কোনও পাঠ্য হিসাবে পরীক্ষা করতে পারেন যা কিছুটা বিশ্রী এবং এটি সবার জন্য সহজে কাজ করে না বলে মনে হয় (নীচে মন্তব্য দেখুন)।


87
ব্যতিক্রম ড্রিলিং কিছুই করে না। এটি কেবল বলে যে একটি ডিবিএন্টিটিভিডিয়েশন রেজাল্ট রয়েছে তবে আপনাকে প্রসারিত হতে দেয় না !!
শুমিই

30
@ শুমিই ব্যতিক্রমটি প্রসারিত করতে এই উত্তরটি দেখুন ।
কেভেন ভনডেলেন

18
শুধু একটি মার্জিত সমাধান প্রসারিত। আপনি নিজের ডিবিকন্টেক্সট ক্লাসে সেভচেনজ পদ্ধতিটি ওভাররাইড করতে চাইতে পারেন, এবং তারপরে ক্রিচ ব্লক যুক্ত করুন, যেখানে চেষ্টা ব্লকটি কেবলমাত্র (বেস.সেইভচেনজেস ()) সংরক্ষণ করার চেষ্টা করে, এবং ক্যাচ ব্লকটি কেবল ডিবিএন্টিটিভিলেশনএক্সেপশন ক্যাচ করে। এইভাবে, আপনার পরিবর্তনগুলি সংরক্ষণ করে এমন প্রতিটি জায়গায় আপনাকে এটি যুক্ত করার দরকার নেই।
মিল্টন

7
এটি একাধিক অনুষ্ঠানে আমার বেকনকে বাঁচিয়েছে। আমি শুধুমাত্র একবার upvote করতে পারে। আশা করি তারা প্রতিবার এটি অনুলিপি করতে এবং আমি এটি অনুলিপি করতে এবং পোস্ট করতে পেরেছি।
দামন ড্রেক

5
কোডের জন্য +2। প্রকৃতপক্ষে একজন ত্রাণকর্তা :) -১ ব্যবহারের জন্য Console.WriteLine, আমি অনুমান করি যে আরও বেশি লোক ওয়েব প্রজেক্ট লিখছেন তবে আজকাল অ্যাপ্লিকেশনগুলি কনসোল Debug.Writeকরে এবং উভয়টিতেই কাজ করে ...
বার্ট

459

আপনি কোনও কোড না লিখে, এমনকি কোনও ব্লকও নয়, ডিবাগ করার সময় ভিজ্যুয়াল স্টুডিও থেকে এটি করতে পারেন।

নামের সাথে কেবল একটি ঘড়ি যুক্ত করুন:

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

ঘড়ির অভিব্যক্তিটি $exceptionবর্তমান প্রসঙ্গে ফেলে দেওয়া কোনও ব্যতিক্রম প্রদর্শন করে, এমনকি যদি এটি কোনও ভেরিয়েবলের কাছে ধরা না পড়ে এবং নাও দেওয়া হয়।

Http://mattrandle.me/ দেখার- ভিত্তিতে বৈধকরণের বৈধতা- ইন-ভিজুয়াল- স্টুডিও/


39
+1 উপায় আরও ভাল সমাধান, এবং কোডে পরিবর্তনের প্রয়োজন হয় না। দুর্দান্ত
জাস্টাস

4
+1 এটি খুব খুব খুব সহজ! আপনার চেষ্টা করার / ক্যাচ ব্লক করার দরকার নেই। ভিএস বিরতি এবং ভয়েলা যখন কেবল ওয়াচ তালিকায় রাখুন .. আপনি সামনে বৈধতা ত্রুটি পেয়েছেন।
theyetiman

40
বছরে দু'বার আমি কীভাবে এটি করতে ভুলে যাই এবং এই উত্তরটি খুঁজে পাই
জাস্টিন মুর

3
@zairja আমি vb.net এটা পরীক্ষিত না, কিন্তু মনে হচ্ছে যে পরিবর্তনশীল ভাল হিসাবে vb.net জন্য সংজ্ঞায়িত করা হয় msdn.microsoft.com/en-us/library/ms164891.aspx তবে ঢালাই সম্ভবত নয় vb.net এর জন্য সংজ্ঞায়িত করা হয়েছে, এবং এর পরিবর্তে আপনার সম্ভবত ডাইরেক্টকাস্ট করা উচিত ($ ব্যতিক্রম,
সিস্টেম.ডাটা.এন্টিটি.ভিডেশন। ডিবিএন্টিটিভিলেশনএক্সেপশন

2
আমি জানি যে "ধন্যবাদ" মন্তব্যগুলিতে স্বাগত নয় তবে আমাকে কয়েক ঘন্টা অপচয় করা রোধ করার জন্য ... ধন্যবাদ!
লুথার

105

কোডটি না লিখে এটি এটি করতে পারে:

আপনার ক্যাচ ব্লকে, নিম্নলিখিত কোডের লাইনে একটি ব্রেক পয়েন্ট যুক্ত করুন:

catch (Exception exception)
{

}

এখন আপনি যদি exceptionএটিকে ঘুরে দেখেন বা এটিকে যুক্ত করেন Watchএবং তারপরে নীচের চিত্রের মতো ব্যতিক্রম বিশদটি নেভিগেট করেন; আপনি দেখতে পাবেন কোন নির্দিষ্ট কলাম (গুলি) সমস্যা সৃষ্টি করছে / কারণ এই ত্রুটিটি সাধারণত ঘটে যখন কোনও টেবিল-সীমাবদ্ধতা লঙ্ঘন করা হয় ..

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

বড় চিত্র image



3
এটি একটি ভাল সমাধান কারণ এটি তাড়াতাড়ি, সহজ, আইডিই ব্যবহার করে এবং আমাকে অনেক সময় বাঁচায়।
ম্যাক্সশুটি

2
আমি এই পদ্ধতিতে "কোডার এবং কোড না করার উপায় কীভাবে করব" পছন্দ করুন
খুলুন এবং বিনামূল্যে

1
ধন্যবাদ. এটি সহজ তবে আইডিই ব্যবহার করে ব্যতিক্রমটি দেখতে দুর্দান্ত।
টমাস। বেঞ্জ

নিখুঁত সমাধান
নীরজ সিং চৌহান

46

এখানে কিভাবে আপনি বিষয়বস্তু পরীক্ষা করতে পারবেন এর EntityValidationErrors সময় (যে কোন অতিরিক্ত কোড লেখা ছাড়া) অর্থাত ভিসুয়াল স্টুডিও মধ্যে ডিবাগ মধ্যে আইডিই

সমস্যাটি?

আপনি ঠিক বলেছেন, ভিজ্যুয়াল স্টুডিও ডিবাগারের দেখুন বিশদ বিবরণ পপআপ EntityValidationErrorsসংগ্রহের মধ্যে প্রকৃত ত্রুটিগুলি দেখায় না ।

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

সমাধান!

একটি দ্রুত ওয়াচ উইন্ডোতে কেবল নীচের প্রকাশটি যুক্ত করুন এবং পুনরায় মূল্যায়ন ক্লিক করুন ।

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

আমার ক্ষেত্রে, দেখুন কীভাবে আমি সংগ্রহের ValidationErrors Listঅভ্যন্তরে প্রসারিত করতে সক্ষমEntityValidationErrors

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

তথ্যসূত্র: mattrandle.me ব্লগ পোস্ট , @ ইওয়েলের উত্তর


3
কেন এটি স্থির করা হয়নি? এটি ত্রুটিটি অন্য কিছু না দেখানো উচিত
জিওমরিলো

2
বৈধতা ত্রুটি সম্পত্তি ত্রুটি দেখায়, প্রাক্তন। বিষয় ক্ষেত্রের প্রয়োজন, ভাল উত্তর, আপনাকে ধন্যবাদ
hamzeh.hanandeh

1
গ্রেট! এটা আমার রাত বাঁচায়! :)
প্যাট্রিক

1
ঘড়িতে সঠিক ত্রুটিটি দেখার জন্য এটি দুর্দান্ত উপায় ... ধন্যবাদ!
কিওয়ার্টি

39

এমনকি কোনও ঘড়ি যোগ না করেই প্রথম ত্রুটিটি দেখার জন্য আপনি এটিকে তাত্ক্ষণিক উইন্ডোতে পেস্ট করতে পারেন:

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

1
এছাড়াও আপনি $ exception.EntityValidationErrors.SelectMany ব্যবহার করতে পারেন (এক্স => x.ValidationErrors) .Select (এক্স => x.ErrorMessage) তাদের মধ্যে :) এই প্রোগ্রামটিতে সমস্ত অবিলম্বে উইন্ডো ব্যবহার পাওয়ার জন্য সবচেয়ে ভাল জবাব
chrispepper1989

15

যে কেউ কাজ করে VB.NET

Try
Catch ex As DbEntityValidationException
    For Each a In ex.EntityValidationErrors
        For Each b In a.ValidationErrors
            Dim st1 As String = b.PropertyName
            Dim st2 As String = b.ErrorMessage
        Next
    Next
End Try

12

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

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

বা:

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

আপনি যদি চেষ্টা / ধরা না পড়েন বা ব্যতিক্রম অবজেক্টে অ্যাক্সেস না পেয়ে থাকেন।

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


10

আপনি যদি সাধারণভাবে ব্যতিক্রম ধরা থাকেন তবে এটি আপনাকে ডিবিএন্টিটিভিলেশনএক্সেপশন হিসাবে কাস্ট করতে সুবিধা করতে পারে । এই ধরনের ব্যতিক্রমের একটি বৈধতা ত্রুটিযুক্ত সম্পত্তি রয়েছে এবং এগুলির মধ্যে আপনার পথটি প্রসারিত করা অব্যাহত রাখলে আপনি সমস্ত সমস্যা খুঁজে পাবেন।

উদাহরণস্বরূপ, আপনি যদি ক্যাচটিতে একটি ব্রেক পয়েন্ট রাখেন তবে আপনি নিম্নলিখিতটি একটি ঘড়িতে ফেলতে পারেন:

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

ত্রুটির একটি উদাহরণ যদি ক্ষেত্রটি নালগুলিকে অনুমতি দেয় না এবং আপনার যদি নাল স্ট্রিং থাকে তবে আপনি দেখতে পাবেন যে ক্ষেত্রটি প্রয়োজনীয়।


9

কেবলমাত্র আপনার ডাটাবেস সারণী ক্ষেত্রের দৈর্ঘ্য পরীক্ষা করুন। আপনার ইনপুট পাঠ্যটি কলাম ক্ষেত্রের ডেটা টাইপের দৈর্ঘ্যের চেয়ে বৃহত্তর


9

ডিবাগ-এ, আপনি এটি আপনার কুইকওয়াচ এক্সপ্রেশন মূল্যায়নকারীর এন্ট্রি ক্ষেত্রে প্রবেশ করতে পারেন:

context.GetValidationErrors()

8

@ স্লুমা থেকে উত্তরটি দুর্দান্ত but

উদাহরণস্বরূপ, বলুন যে আপনার কাছে Phoneজটিল ধরণের একটি সম্পত্তি রয়েছে PhoneNumber। যদি AreaCodeসম্পত্তি অবৈধ, সম্পত্তি নাম ve.PropertyNames"Phone.AreaCode" হয়। এর ফলে কলটি eve.Entry.CurrentValues<object>(ve.PropertyName)ব্যর্থ হয়।

এটি ঠিক করার জন্য, আপনি প্রত্যেকটিতে সম্পত্তির নাম বিভক্ত করতে পারেন ., তারপরে সম্পত্তি নামের ফলাফলের অ্যারে দিয়ে পুনরাবৃত্তি করতে পারেন । অবশেষে, আপনি যখন শৃঙ্খলের নীচে পৌঁছবেন, আপনি কেবলমাত্র সম্পত্তিটির মানটি ফিরিয়ে দিতে পারবেন।

FormattedDbEntityValidationExceptionকমপ্লেক্সটাইপগুলির জন্য সমর্থন সহ নীচে @ স্লুমার ক্লাস রয়েছে।

উপভোগ করুন!

[Serializable]
public class FormattedDbEntityValidationException : Exception
{
    public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
        base(null, innerException)
    {
    }

    public override string Message
    {
        get
        {
            var innerException = InnerException as DbEntityValidationException;
            if (innerException == null) return base.Message;

            var sb = new StringBuilder();

            sb.AppendLine();
            sb.AppendLine();
            foreach (var eve in innerException.EntityValidationErrors)
            {
                sb.AppendLine(string.Format("- Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                    eve.Entry.Entity.GetType().FullName, eve.Entry.State));
                foreach (var ve in eve.ValidationErrors)
                {
                    object value;
                    if (ve.PropertyName.Contains("."))
                    {
                        var propertyChain = ve.PropertyName.Split('.');
                        var complexProperty = eve.Entry.CurrentValues.GetValue<DbPropertyValues>(propertyChain.First());
                        value = GetComplexPropertyValue(complexProperty, propertyChain.Skip(1).ToArray());
                    }
                    else
                    {
                        value = eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName);
                    }
                    sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                        ve.PropertyName,
                        value,
                        ve.ErrorMessage));
                }
            }
            sb.AppendLine();

            return sb.ToString();
        }
    }

    private static object GetComplexPropertyValue(DbPropertyValues propertyValues, string[] propertyChain)
    {
        var propertyName = propertyChain.First();
        return propertyChain.Count() == 1 
            ? propertyValues[propertyName] 
            : GetComplexPropertyValue((DbPropertyValues)propertyValues[propertyName], propertyChain.Skip(1).ToArray());
    }
}

1
আমি বিশ্বাস করতে পারি না যে আরও বেশি লোক এইটিকে উজ্জীবিত করেনি, কারণ এটি একটি সত্যিকারের দৃশ্য এবং এটি গত দুই রাত্রে আমাকে চালিত করে চলেছে। আপনি জানেন যে আপনার ত্রুটি পরিচালনার বিষয়টি বুঝতে পেরে আপনি যে অনুভূতিটি পেয়েছেন তা হ'ল আসলে ত্রুটিটি কী ঘটছে? বিতৃষ্ণা।
ডিজে গ্রসম্যান

7

নোট যেটি Entity.GetType().BaseType.Nameআপনার নির্দিষ্ট করা টাইপের নাম দেয়, তার নামটিতে সমস্ত হেক্স সংখ্যার সাথে নয়।


7

@ স্লুমার জবাব এবং @ মিল্টনের পরামর্শ অনুসারে আমি আমাদের বেস ক্লাসের কাস্টম সংরক্ষণ পদ্ধতিটি চেষ্টা / ক্যাপচারের সাহায্যে প্রসারিত করেছি যা এই ধরণের ব্যতিক্রমকে পরিচালনা করবে (এবং তাই আমাদের ত্রুটি লগিংয়ে লগ ইন করে!)

// Where `BaseDB` is your Entities object... (it could be `this` in a different design)
public void Save(bool? validateEntities = null)
{
    try
    {
        //Capture and set the validation state if we decide to
        bool validateOnSaveEnabledStartState = BaseDB.Configuration.ValidateOnSaveEnabled;
        if (validateEntities.HasValue)
            BaseDB.Configuration.ValidateOnSaveEnabled = validateEntities.Value;

        BaseDB.SaveChanges();

        //Revert the validation state when done
        if (validateEntities.HasValue)
            BaseDB.Configuration.ValidateOnSaveEnabled = validateOnSaveEnabledStartState;
    }
    catch (DbEntityValidationException e)
    {
        StringBuilder sb = new StringBuilder();
        foreach (var eve in e.EntityValidationErrors)
        {
            sb.AppendLine(string.Format("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)
            {
                sb.AppendLine(string.Format("- Property: \"{0}\", Error: \"{1}\"",
                                            ve.PropertyName,
                                            ve.ErrorMessage));
            }
        }
        throw new DbEntityValidationException(sb.ToString(), e);
    }
}

1
আপনি sb.Append Format () সরাসরি ব্যবহার করতে পারেন
Bastien

1
আপনি অ্যাপেন্ডফর্ম্যাটটি ব্যবহার করলে আপনার নিজের নিজস্ব নিজস্ব অনলাইনলাইনও যুক্ত করতে হবে।
জোকুল

7

আমাকে তাৎক্ষণিক উইন্ডোতে লিখতে হয়েছিল: 3

(((exception as System.Data.Entity.Validation.DbEntityValidationException).EntityValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbEntityValidationResult>)[0].ValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbValidationError>)[0]

সঠিক ত্রুটি গভীরতর পেতে!


6

@ স্লুমার উত্তরটি ব্যবহার করে আমি আরও ভাল ব্যবহারের জন্য একটি কোড স্নিপেট (একটি স্নিপেটের চারপাশে) তৈরি করেছি।

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
      <Title>ValidationErrorsTryCatch</Title>
      <Author>Phoenix</Author>
      <Description>
      </Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>
      </Shortcut>
    </Header>
    <Snippet>
      <Code Language="csharp"><![CDATA[try
{
    $selected$ $end$
}
catch (System.Data.Entity.Validation.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;
}]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

5

একটি চেষ্টা করে ব্যতিক্রমটি ধরুন এবং তারপরে দ্রুত ঘড়ি বা সিটিআরএল + ডি ও সিটিআরএল + কিউ করুন এবং আপনি এন্টিভিলেডেশনআরিয়ার্সে ড্রিল করতে পারেন।


5

শুধু আমার দুটি সেন্ট ভিতরে in

আমার dbConfigration.cs এর মধ্যে, আমি আমার প্রসঙ্গটি সংরক্ষণ করতে চাই ave সেভচেন্জেস () পদ্ধতিটি চেষ্টা / ধরার জন্য এবং একটি আউটপুট পাঠ্য ফাইল তৈরি করে যা আমাকে ত্রুটি (গুলি) পরিষ্কারভাবে পড়তে দেয় এবং এই কোডটি তাদের টাইমস্ট্যাম্পগুলিও দেয় - যদি আপনি সুবিধাজনক হন তবে বিভিন্ন সময়ে একাধিক ত্রুটি চালানো!

        try
        {
            context.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            //Create empty list to capture Validation error(s)
            var outputLines = new List<string>();

            foreach (var eve in e.EntityValidationErrors)
            {
                outputLines.Add(
                    $"{DateTime.Now}: Entity of type \"{eve.Entry.Entity.GetType().Name}\" in state \"{eve.Entry.State}\" has the following validation errors:");
                outputLines.AddRange(eve.ValidationErrors.Select(ve =>
                    $"- Property: \"{ve.PropertyName}\", Error: \"{ve.ErrorMessage}\""));
            }
            //Write to external file
            File.AppendAllLines(@"c:\temp\dbErrors.txt", outputLines);
            throw;
        }

5

আমি কী খুঁজে পেয়েছি ... যখন আমি 'সত্তাবিশেষকরণের ত্রুটিগুলি পেয়েছি' ত্রুটিটি হ'ল .... আমার ডাটাবেসে 'ডিবি 1' টেবিলের 'টিব্ল্যাড্রেস' হিসাবে 'ঠিকানা 1' রয়েছে যার আকার 100 (অর্থাৎ ঠিকানা বর্ণচরিত (100) নাল) এবং আমি 100 টিরও বেশি অক্ষর দিয়ে চলেছি .. এবং এটি ডাটাবেসে ডেটা সংরক্ষণ করার সময় ত্রুটির দিকে পরিচালিত করে ....

সুতরাং আপনি অবশ্যই সেই ক্ষেত্রটিতে যা যাচ্ছেন তা অবশ্যই পরীক্ষা করা উচিত Check


1
আমি এই উত্তরটির প্রশংসা করি কারণ এটি আমাকে আমার ত্রুটিটি সমাধান করতে সহায়তা করেছিল। আমি আমার ডিবিতে যে সারণীতে সংরক্ষণ করছিলাম সেটিতে সমস্ত not nullকলাম ছিল তাই আমি একবার db.SaveChanges()ত্রুটি না পেয়ে আমার সমস্ত উপাদানগুলিতে ডেটা যুক্ত করেছি ।
বাইনারিজে01

3

এটি আমার পক্ষে কাজ করে।

var modelState = ModelState.Values;
if (!ModelState.IsValid)
{
    return RedirectToAction("Index", "Home", model);
}

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

আমি আশা করি এটি সাহায্য করবে

যদি জিজ্ঞাসা করা হয় তবে আমি ডিবাগ উইন্ডোতে বিস্তারিত স্ক্রিনশট সরবরাহ করতে পারি।


3

অন্যান্য পোস্টে উল্লিখিত হিসাবে, কেবলমাত্র DbEntityValidationException শ্রেণিতে ব্যতিক্রমটি ধরুন। যা আপনাকে ত্রুটির ক্ষেত্রে প্রয়োজন এমন জল সরবরাহ করবে।

 try
 {
  ....
 }
 catch(DbEntityValidationException ex)
 {
  ....
 }

2

আমি আগে এই ত্রুটির মুখোমুখি হয়েছি

যখন আমি সত্তা ফ্রেমওয়ার্কে আমার মডেলটিতে নির্দিষ্ট ক্ষেত্রটি আপডেট করার চেষ্টা করেছি

Letter letter = new Letter {ID = letterId, ExportNumber = letterExportNumber,EntityState = EntityState.Modified};
LetterService.ChangeExportNumberfor(letter);
//----------


public int ChangeExportNumber(Letter letter)
    {
        int result = 0;
        using (var db = ((LettersGeneratorEntities) GetContext()))
        {
            db.Letters.Attach(letter);
            db.Entry(letter).Property(x => x.ExportNumber).IsModified = true;
            result += db.SaveChanges();
        }
        return result;
    }

এবং উপরের উত্তর অনুসারে

আমি বৈধকরণ বার্তা পেয়েছি The SignerName field is required.

যা আমার মডেলটিতে ক্ষেত্রের দিকে ইঙ্গিত করছে

এবং যখন আমি আমার ডাটাবেস স্কিমাটি পরীক্ষা করেছিলাম

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

সুতরাং বন্ধ কুরিয়ার ValidationExceptionউত্থাপনের অধিকার আছে

এবং এই ক্ষেত্র অনুসারে আমি চাই এটি অবিচল হোক, (আমি জানি না কীভাবে আমি এটি গোলমাল করেছি)

সুতরাং নুলকে অনুমতি দেওয়ার জন্য আমি সেই ক্ষেত্রটি পরিবর্তন করেছি এবং এর মাধ্যমে আমার কোড আমাকে আর এই ত্রুটিটি দেবে না

সুতরাং আপনি যদি আপনার ডাটাবেসের ডেটা অখণ্ডতা অবৈধ করেন তবে এই ত্রুটিটি ঘটবে


1
একটি ব্যতিক্রম উত্থাপন করা উচিত বা না তা এখানে মূল বিষয় নয়। এর পরে, আপনি এখানে কিছু কোণ কাটছেন। ডাটাবেস স্কিমাতে যখন কোনও ক্ষেত্রের প্রয়োজন হয় তখন আপনাকে DbEntityValidationExceptionউত্থাপনের চেয়ে আরও বেশি প্রয়োজন ।
গার্ট আর্নল্ড

2

আপনি যে ক্ষেত্রের মানটি পার করছেন তা বৈধ এবং ডাটাবেস ক্ষেত্র অনুসারে দয়া করে পরীক্ষা করুন। উদাহরণস্বরূপ কোনও নির্দিষ্ট ক্ষেত্রে পাস করা অক্ষরের সংখ্যা ডাটাবেস টেবিল ক্ষেত্রে বর্ণিত অক্ষরের চেয়ে কম হয়।


1

আপনি যদি উইন্ডোজ প্রমাণীকরণ এবং সত্তা ফ্রেমওয়ার্কের সাথে আইআইএস ব্যবহার করেন তবে ব্যবহারে সতর্ক থাকুন ।authorize

আমি করার চেষ্টা POSTঅনুমোদন ছাড়া এটা কাজ করে নি, এবং এই ভুল পান db.SaveChangesAsync();, যখন অন্য সকল ক্রিয়া GETএবং DELETEকাজ করছিলেন।

তবে যখন আমি টীকা হিসাবে অনুমোদনপ্রাপ্ত সংযুক্তিটি যুক্ত করি তখন এটি কার্যকর হয়েছিল।

[Authorize]
public async Task<IHttpActionResult> Post(...){
....
}

1

এন্টিভিডিলেশনআরিয়ারগুলির সন্ধানের জন্য ফোরচ লুপগুলি ব্যবহার না করে এটি করার অন্য উপায়। অবশ্যই আপনি নিজের পছন্দ মতো বার্তাটি ফর্ম্যাট করতে পারেন:

try {
        // your code goes here...
    } 
catch (DbEntityValidationException ex) 
    {
        Console.Write($"Validation errors: {string.Join(Environment.NewLine, ex.EntityValidationErrors.SelectMany(vr => vr.ValidationErrors.Select(err => $"{err.PropertyName} - {err.ErrorMessage}")))}", ex);
        throw;
    }

1

আমার ক্ষেত্রে এটি ডাটাবেস ক্ষেত্রের দৈর্ঘ্যের কারণে ইনপুট ফিল্ডের দৈর্ঘ্যের চেয়ে কম ছিল।

ডাটাবেস টেবিল

create table user(
  Username nvarchar(5) not  null
);

আমার ইনপুট

User newUser = new User()
{
   Username = "123456"
};

জন্য মান Username lengthহয় 5 যা lessthan6

... এটি কারও সাহায্য করতে পারে


0

Not Nullআপনার টেবিল কলামগুলিতে আপনার সীমাবদ্ধতা রয়েছে কিনা এবং সন্নিবেশ / আপডেট অপারেশন করার সময় আপনি সেই কলামটির মানটি পাস করেন না তা পরীক্ষা করে দেখুন। এটি সত্তা কাঠামোর এই ব্যতিক্রম ঘটায়।


0

আমিও একই সমস্যার মুখোমুখি হয়েছি। আমি ব্যতিক্রমটি নিখোঁজ হয়ে যাওয়ার পরে ডাটাবেস থেকে আমার .edmx আপডেট করেছি।



0

এই ত্রুটিটির সাথেও লড়াই করে চলেছিল এবং এখানে বিষয়ের উপর ভিত্তি করে এবং এই উত্তরটি কী কোডটি আমদানি করতে হবে তা নির্ধারণ করা / পেস্ট করার জন্য স্নিপেটটি বের করতে সক্ষম হয়েছিল (সি # নতুনদের জন্য দুর্দান্ত), নীচের কোড:

try
{
  context.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException ex)
{
  foreach (var entityValidationErrors in ex.EntityValidationErrors)
  {
    foreach (var validationError in entityValidationErrors.ValidationErrors)
    {
      System.Diagnostics.Debug.WriteLine("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.