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




entity-framework entity-framework-4 (15)

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

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

لأكون صادقًا ، لا أعرف كيفية التحقق من محتوى أخطاء التحقق من الصحة. يُظهر لي Visual Studio أنه صفيف يحتوي على 8 كائنات ، لذا فإن 8 أخطاء في التحقق من الصحة.

كان هذا يعمل مع النموذج السابق الخاص بي ، ولكني أجريت بعض التغييرات التي أشرحها أدناه:

  • كان لدي تعداد اسمه "الحالة" ، وقمت بتغييره إلى فئة تسمى الحالة
  • لقد قمت بتغيير فئة ApplicantsPositionHistory للحصول على مفتاح خارجي 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
        }
    }
}

لأكون صادقًا ، لا أعرف كيفية التحقق من محتوى أخطاء التحقق من الصحة. يُظهر لي Visual Studio أنه صفيف يحتوي على 8 كائنات ، لذا فإن 8 أخطاء في التحقق من الصحة.

في الواقع يجب أن تشاهد الأخطاء إذا قمت بالبحث في هذا الصفيف في Visual Studio أثناء التصحيح. ولكن يمكنك أيضًا التقاط الاستثناء ثم كتابة الأخطاء إلى بعض مخازن التسجيل أو وحدة التحكم:

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 هي مجموعة تمثل الكيانات التي لا يمكن التحقق منها بنجاح ، ومجموعة 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 لأنه يعمل في جميع أنواع التطبيقات ، وليس فقط تطبيقات وحدة التحكم (بفضلBart لملاحظته في التعليقات أدناه).

بالنسبة لتطبيقات الويب قيد الإنتاج والتي تستخدم Elmah لتسجيل الاستثناء ، تبين أنها مفيدة جدًا بالنسبة لي لإنشاء استثناء مخصص والكتابة فوق 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;
        }
    }
}

بعض الملاحظات:

  • تعرض شاشة الخطأ الصفراء التي تعرضها Elmah في واجهة الويب أو في رسائل البريد الإلكتروني المرسلة (إذا قمت بتهيئة ذلك) تفاصيل التحقق من الصحة مباشرة أعلى الرسالة.

  • الكتابة فوق الخاصية Message في الاستثناء المخصص بدلاً من الكتابة فوق ToString() له الفائدة التي يعرضها "شاشة أصفر فاتح" (YSOD) "ASP.NET القياسي" هذه الرسالة أيضاً. على النقيض من Elmah فإن YSOD لا تستخدم على ما يبدو ToString() ، لكن كل منهما يعرض خاصية Message .

  • يضمن التفاف DbEntityValidationException الأصلي DbEntityValidationException داخلي أن تظل تتبع المكدس الأصلي متوفرة ويتم عرضها في Elmah و YSOD.

  • عن طريق تحديد نقطة توقف على الخط throw newException; يمكنك ببساطة فحص خاصية newException.Message كنص بدلاً من البحث في مجموعات التحقق من الصلاحية والتي تبدو غريبة قليلاً ولا يبدو أنها تعمل بسهولة للجميع (راجع التعليقات أدناه).


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

على سبيل المثال ، إذا وضعت نقطة فاصل في الالتقاط ، فيمكنك رمي ما يلي في ساعة:

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

مثال على الخطأ هو إذا كان الحقل لا يسمح بالقيم الفارغة ، وكان لديك سلسلة فارغة ، سترى أنه يقول أن هذا الحقل مطلوب.


الإجابة منSlauma رائعة حقًا ولكنني وجدت أنها لم تنجح عندما كانت خاصية ComplexType غير صالحة.

على سبيل المثال ، لنفترض أنك تمتلك خاصية Phone من نوع المجمع PhoneNumber . إذا كانت الخاصية AreaCode غير صالحة ، فإن اسم الخاصية في ve.PropertyNames هو "Phone.AreaCode". هذا يؤدي استدعاء eve.Entry.CurrentValues<object>(ve.PropertyName) فشل.

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

أدناه هو @ FormlaDa FormattedDbEntityValidationException الطبقة مع دعم ComplexTypes.

استمتع!

[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());
    }
}

باستخدام إجابةSlauma لقد قمت بعمل مقتطف شفرة (محيط بالمقتطف) لاستخدام أفضل.

<?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>

فقط تحقق من طول حقل جدول قاعدة البيانات. نص الإدخال الخاص بك أكبر من طول طول نوع بيانات حقل العمود


فقط رمي بلدي اثنين سنت في ...

ضمن dbConfiguration.cs الخاص بي ، أحب التفاف السياق context.SaveChanges () في محاولة / catch وإنشاء ملف نصي إخراج يسمح لي بقراءة Error (s) بوضوح ، وهذا الرمز أيضًا يختصرها - سهل الاستخدام إذا كنت واجهت أكثر من خطأ واحد في أوقات مختلفة!

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

فيما يلي كيفية التحقق من محتويات EntityValidationErrors في Visual Studio (بدون كتابة أي كود إضافي) أي أثناء تصحيح الأخطاء في IDE .

المشكلة؟

أنت على حق ، لا يعرض " عرض منبثق التفاصيل" الخاص بـ Visual Studio debugger الأخطاء الفعلية داخل مجموعة EntityValidationErrors .

الحل!

ما عليك سوى إضافة التعبير التالي في نافذة Quick Watch والنقر على Reevaluate .

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

في حالتي ، انظر كيف يمكنني التوسع في List ValidationErrors داخل مجموعة EntityValidationErrors

المراجع: http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/ ، @ http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/ الإجابة


قبض على الاستثناء في تجربة المحاولة ، ثم شاهد سريعًا أو ctrl + d & ctrl + q ويمكنك الانتقال لأسفل إلى EntityValidationErrors.


كما ذكر في مشاركات أخرى ، ببساطة التقاط الاستثناء في فئة DbEntityValidationException. والتي سوف تعطيك watever المطلوبة أثناء حالات الخطأ.

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

لاحظ أن Entity.GetType().BaseType.Name يعطي اسم النوع الذي حددته ، وليس الذي يحتوي على كل الأرقام Entity.GetType().BaseType.Name عشرية في اسمه.


لمن يعمل في 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

ما وجدت ... عندما حصلت على خطأ "EntityValidationErrors" هو أن .... لدي حقل في قاعدة البيانات الخاصة بي 'db1' في الجدول 'tbladdress' باسم 'address1' الذي يحتوي على حجم 100 (أي عنوان varchar (100) فارغة) وكنت تمرير القيمة أكثر من 100 حرفا ... وهذا يؤدي إلى خطأ أثناء حفظ البيانات إلى قاعدة البيانات ....

لذلك يجب عليك التحقق من البيانات التي تمرر إلى الميدان.


هذا يمكن فعله بالفعل دون الحاجة إلى كتابة التعليمات البرمجية:

في كتلة catch ، أضف نقطة فاصل على سطر التعليمة البرمجية التالي:

catch (Exception exception)
{

}

الآن إذا قمت بالتمرير فوق exception أو إضافته إلى Watch ثم انتقل إلى تفاصيل الاستثناء كما هو موضح أدناه ؛ سترى أي عمود (أعمدة) معينة يسبب المشكلة حيث يحدث هذا الخطأ عادةً عند انتهاك قيد الجدول.

صورة كبيرة


واجهت هذا الخطأ من قبل

عندما حاولت تحديث حقل معين في النموذج الخاص بي في إطار عمل الكيان

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.

والتي تشير إلى حقل في النموذج الخاص بي

وعندما راجعت مخطط قاعدة البيانات لدي وجدت

حتى قبالة coure ValidationException له الحق في رفع

وحسب هذا المجال ، أريده أن يكون ملغياً ، (لا أعرف كيف أفسده)

لذلك غيرت هذا المجال للسماح Null ، وبواسطة هذا الرمز الخاص بي لن يعطيني هذا الخطأ مرة أخرى

لذلك قد يحدث هذا الخطأ في حالة إبطال سلامة بياناتك في قاعدة البيانات الخاصة بك


يمكنك القيام بذلك من Visual Studio أثناء التصحيح دون كتابة أي تعليمات برمجية أو حتى كتلة catch.

ما عليك سوى إضافة ساعة بالاسم:

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

يعرض $exception expression watch أي استثناء يتم طرحه في السياق الحالي ، حتى إذا لم يتم ضبطه وتعيينه لمتغير.

استنادًا إلى http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/





entity-framework-4.1