Walidacja nie powiodła się dla jednego lub więcej podmiotów. Zobacz właściwość 'EntityValidationErrors' po więcej szczegółów [duplikat]

to pytanie ma już odpowiedzi tutaj : uzyskiwanie dokładnego typu błędu z DbValidationException (6 odpowiedzi) Zamknięty 6 miesięcy temu .

Mam ten błąd podczas pozycjonowania mojej bazy danych z kodem pierwszego podejścia.

Walidacja nie powiodła się dla jednego lub więcej podmiotów. Zobacz właściwość 'EntityValidationErrors', aby uzyskać więcej informacji.

Szczerze mówiąc Nie wiem jak sprawdzić zawartość błędów walidacji. Visual Studio pokazuje mi, że jest to tablica z 8 obiektami, więc 8 błędów walidacji.

To działało z moim poprzednim modelem, ale Zrobiłem kilka zmian, które wyjaśniam poniżej:

  • miałem enum o nazwie Status, zmieniłem go na klasę o nazwie Status
  • zmieniłem klasę ApplicantsPositionHistory, aby mieć 2 klucze obce do tej samej tabeli

Przepraszam za długi kod, ale muszę go wkleić. Wyjątek jest wrzucany do ostatniej linii poniższego kodu.

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
        }
    }
}
Author: Laurel, 2011-10-17

29 answers

Szczerze mówiąc Nie wiem jak sprawdzić zawartość błędów walidacji. Visual Studio pokazuje mi, że jest to tablica z 8 obiektami, więc 8 błędów walidacji.

W rzeczywistości powinieneś zobaczyć błędy, jeśli wiercisz do tej tablicy w Visual studio podczas debugowania. Ale możesz również złapać wyjątek, a następnie zapisać błędy do jakiegoś sklepu logowania lub konsoli:

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 jest zbiorem reprezentującym podmioty, których nie można zweryfikować zbiór wewnętrzny ValidationErrors na encję jest listą błędów na poziomie właściwości.

Te komunikaty walidacyjne są zwykle na tyle pomocne, aby znaleźć źródło problemu.

Edit

Kilka drobnych ulepszeń:

wartość właściwości mogą być zawarte w pętli wewnętrznej tak:

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

Podczas debugowania {[6] } może być lepsze niż Console.WriteLine, ponieważ działa we wszystkich rodzajach aplikacji, nie tylko aplikacje konsolowe (podziękowania dla @ Barta za notkę w komentarzach poniżej).

Dla aplikacji internetowych, które są w produkcji i które używają Elmah do logowania WYJĄTKÓW okazało się bardzo przydatne dla mnie, aby utworzyć niestandardowy wyjątek i nadpisać SaveChanges w celu wyrzucenia tego nowego wyjątku.

Niestandardowy typ wyjątku wygląda następująco:

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

I SaveChanges można nadpisać w następujący sposób:

public class MyContext : DbContext
{
    // ...

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

Kilka uwagi:

  • Żółty ekran błędu, który Elmah pokazuje w interfejsie WWW lub w wysłanych e-mailach (jeśli skonfigurowałeś to), wyświetla teraz szczegóły walidacji bezpośrednio na górze wiadomości.

  • Nadpisanie właściwości Message W wyjątku niestandardowym zamiast nadpisywania ToString() ma tę zaletę, że standard ASP.NET "Yellow screen of death (YSOD)" wyświetla również ten Komunikat. W przeciwieństwie do Elmah YSOD najwyraźniej nie używa ToString(), ale oba wyświetlają właściwość Message.

  • Owinięcie oryginalnego DbEntityValidationException jako wewnętrznego wyjątku zapewnia, że oryginalny ślad stosu będzie nadal dostępny i będzie wyświetlany w Elmah i YSOD.

  • Ustawiając punkt przerwania w linii throw newException;, możesz po prostu sprawdzić właściwość newException.Message jako tekst, zamiast wiercić w kolekcjach walidacji, co jest nieco niezręczne i nie wydaje się działać łatwo dla wszystkich (Zobacz komentarze poniżej).

 1271
Author: Slauma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-14 19:05:48

Możesz to zrobić z Visual Studio podczas debugowania bez pisania kodu,nawet bloku catch.

Wystarczy dodać zegarek o nazwie:

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

Wyrażenie watch $exception wyświetla każdy wyjątek wyrzucony w bieżącym kontekście, nawet jeśli nie został przechwycony i przypisany do zmiennej.

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

 467
Author: yoel halb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 07:29:00

To mogłoby to zrobić bez konieczności pisania kodu:

W bloku catch Dodaj punkt przerwania w następującej linii kodu:

catch (Exception exception)
{

}

Teraz, jeśli najedziesz kursorem na exception lub dodasz go do Watch, a następnie przejdziesz do szczegółów wyjątku, jak pokazano poniżej; zobaczysz, które kolumny są / są przyczyną problemu, ponieważ ten błąd zwykle występuje, gdy ograniczenie tabeli jest naruszone..

Tutaj wpisz opis obrazka

Duży obraz

 108
Author: t_plusplus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-22 14:30:07

Oto jak możesz sprawdzić zawartość EntityValidationErrors w Visual Studio (bez pisania dodatkowego kodu), np. podczas debugowania {7]} w IDE .

Problem?

Masz rację, wyskakujące okienko debuggera Visual Studio View Details nie pokazuje rzeczywistych błędów wewnątrz kolekcji EntityValidationErrors.

Tutaj wpisz opis obrazka

Rozwiązanie!

Wystarczy dodać następujące wyrażenie w Quick Watch okno i kliknij Reevaluate .

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

W moim przypadku, zobacz, jak jestem w stanie rozwinąć się w ValidationErrors List inside The EntityValidationErrors collection

Tutaj wpisz opis obrazka

Linki: mattrandle.me wpis na blogu, @odpowiedź yoela

 51
Author: Shiva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Aby szybko zobaczyć pierwszy błąd bez dodawania zegarka, możesz wkleić go w oknie natychmiastowym:

((System.Data.Entity.Validation.DbEntityValidationException)$exception)
    .EntityValidationErrors.First()
    .ValidationErrors.First()
 39
Author: djdmbrwsk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 12:58:28

Dla każdego kto pracuje w 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
 17
Author: nghiavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-30 10:57:20

Gdy jesteś w trybie debugowania w bloku catch {...} Otwórz okno " QuickWatch "( ctrl+alt+q ) i wklej tam:

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

lub:

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

Jeśli nie jesteś w try/catch lub nie masz dostępu do obiektu wyjątku.

To pozwoli Ci wwiercić się w drzewo. To najprostszy sposób, jaki znalazłem, aby uzyskać natychmiastowy wgląd w te błędy.
 12
Author: GONeale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 01:29:11

Jeśli po prostu łapiesz ogólny wyjątek, może Ci się przydać umieszczenie go jako DbEntityValidationException . Ten typ wyjątku ma właściwość Validation Errors i nadal rozszerzając swoją drogę do nich, znajdziesz wszystkie problemy.

Na przykład, jeśli umieścisz break point w haczyku, możesz wrzucić następujące elementy do zegarka:

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

Przykładem błędu jest jeśli pole nie zezwala na NULL, a masz łańcuch null, zobaczysz go powiedz, że pole jest wymagane.

 10
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 19:17:06

Wystarczy Sprawdzić Długość Pola Tabeli Bazy Danych . Tekst wejściowy jest większy niż długość pola kolumny typ danych length

 9
Author: Hardeep Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 05:11:52

W debugowaniu możesz to wprowadzić w polu QuickWatch expression evaluator:

context.GetValidationErrors()
 9
Author: silverfox1948,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-09 05:34:48

Odpowiedź od @Slauma jest naprawdę świetna, ale odkryłem, że nie działa, gdy właściwość ComplexType była nieprawidłowa.

Na przykład, powiedzmy, że masz Właściwość Phone typu complex PhoneNumber. Jeśli właściwość AreaCode jest nieprawidłowa, nazwa właściwości w ve.PropertyNames to " Phone.AreaCode". Powoduje to niepowodzenie wywołania eve.Entry.CurrentValues<object>(ve.PropertyName).

Aby to naprawić, możesz podzielić nazwę właściwości na każdą ., a następnie rekurencyjnie przez wynikową tablicę nazw właściwości. Wreszcie, kiedy dotrzesz na dno łańcuch, można po prostu zwrócić wartość właściwości.

Poniżej znajduje się Klasa @Slauma FormattedDbEntityValidationException z obsługą złożonych typów.

Enjoy!
[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());
    }
}
 8
Author: mikesigs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-30 05:46:33

Zauważ, że Entity.GetType().BaseType.Name podaje nazwę typu, który podałeś, a nie ten, który zawiera wszystkie cyfry szesnastkowe w swojej nazwie.

 7
Author: Eric Nelson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-24 19:48:12

Per @ slauma 's answer and @ Milton' s suggestion I 've extended our base class' s custom Save method with a try/catch that will handle (and therefore log in our error logging!) tego rodzaju wyjątki.

// 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);
    }
}
 7
Author: jocull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 16:02:41

Musiałem to napisać w oknie: 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]

Aby zagłębić się w dokładny błąd !

 7
Author: Nour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-14 09:03:50

Korzystając z odpowiedzi @Slauma zrobiłem fragment kodu (fragment z snippetem) dla lepszego wykorzystania.

<?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>
 6
Author: Phoenix_uy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 19:57:41

Złap wyjątek w Try catch, a następnie quick watch lub ctrl + d & ctrl + q i możesz przejść do EntityValidationErrors.

 5
Author: Brandon.Staley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 13:24:07

Wrzuciłem tylko moje 2 centy...

W mojej konfiguracji dbConfiguration.cs, Lubię owijać w bawełnę.SaveChanges () metoda do try / catch i produkować wyjściowy plik tekstowy, który pozwala mi odczytać błąd(y) wyraźnie, a ten kod również timestamps je-przydatne, jeśli uruchomić więcej niż jeden błąd w różnych czasach!

        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
Author: IfElseTryCatch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-03 14:05:51

To, co znalazłem...kiedy dostałem błąd "EntityValidationErrors" jest to....mam pole w mojej bazie danych 'db1' w tabeli ' tbladdress 'jako ' address1', które ma rozmiar 100(tzn. adres varchar (100) null) i przekazywałem Wartość więcej niż 100 znaków..a to prowadzi do błędu podczas zapisywania danych do bazy danych....

Więc musisz sprawdzić dane, które przekazujesz do pola.

 5
Author: Dharmendra Prajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 09:36:24

To mi pasuje.

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

Umieścić punkt przerwania na instrukcji if. Następnie możesz sprawdzić modelState w oknach debugowania. Na każdej wartości można zobaczyć, czy jest błąd, a nawet Komunikat o błędzie. To wszystko. Kiedy już go nie potrzebujesz, po prostu usuń lub skomentuj linię.

Mam nadzieję, że to pomoże.

Jeśli zapytasz, mogę dostarczyć szczegółowy zrzut ekranu w oknie debugowania.

 3
Author: AngelDown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 19:26:49

Jak wspomniano w innych postach, po prostu złap wyjątek w klasie DbEntityValidationException. Co da Ci wszystko, czego potrzebujesz podczas przypadków błędów.

 try
 {
  ....
 }
 catch(DbEntityValidationException ex)
 {
  ....
 }
 3
Author: Mayank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 04:26:07

Spotkałem się z tym błędem przed

Kiedy próbowałem zaktualizować określone pole w moim modelu w entity framwork

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

I zgodnie z powyższymi odpowiedziami

I found the Validation message The SignerName field is required.

Które wskazuje na pole w moim modelu

I kiedy sprawdzałem schemat bazy danych znalazłem

Tutaj wpisz opis obrazka

Więc off coure ValidationException ma prawo podnieść

I zgodnie z tym polem chcę aby było nullable, (Nie wiem jak

Więc zmieniłem to pole, aby zezwalać na Null, a przez to mój kod nie spowoduje więcej tego błędu

Więc ten błąd może się zdarzyć, jeśli unieważnisz integralność danych w bazie danych

 2
Author: Basheer AL-MOMANI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

Proszę sprawdzić wartości pól, które przekazujesz, są poprawne i zgodne z polami bazy danych. Na przykład liczba znaków przekazywanych w danym polu jest mniejsza niż znaki zdefiniowane w polu tabela bazy danych.

 2
Author: arun tiwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-07 03:24:18

W moim przypadku było to spowodowane tym, że długość pola bazy danych jest mniejsza niż długość pola wejściowego.

Tabela bazy danych

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

Moje wejście

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

Wartość dla Username length na 5 czyli lessthan 6

...to może komuś pomóc

 2
Author: Qwerty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-08 18:41:02

Również zmagał się z tym błędem i bazując na tym temacie i Ta odpowiedź była w stanie dowiedzieć się, co należy skopiować/wkleić bez potrzeby zastanawiania się, co ma być zaimportowane (doskonały dla początkujących w C#), kod poniżej:

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);
    }
  }
}
 2
Author: Daniel Danielecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-16 11:04:17

Jeśli używasz IIS z uwierzytelnianie Windows i Entity Framework , Należy uważać, aby używać authorize.

Próbowałem POST bez autoryzacji i nie zadziałało, i dostałem ten błąd na db.SaveChangesAsync();, podczas gdy wszystkie inne czasowniki GET i DELETE działały.

Ale kiedy dodałem AuthorizeAttribute jako adnotację, zadziałało.

[Authorize]
public async Task<IHttpActionResult> Post(...){
....
}
 1
Author: Toodoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-18 12:56:26

Oto inny sposób, aby to zrobić, zamiast używać pętli foreach do zaglądania do wnętrza EntityValidationErrors. Oczywiście możesz sformatować wiadomość według własnych upodobań :

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
Author: Quantum_Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-16 14:47:49

Ten błąd występuje głównie z powodu rozmiaru pola. Sprawdź wszystkie rozmiary pól w tabeli bazy danych.

 1
Author: Alexander Zaldostanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-25 02:32:16

Sprawdź, czy masz Not Null ograniczenie w kolumnach tabeli i nie przekazujesz wartości dla tej kolumny podczas operacji insert/Update. To powoduje ten wyjątek w ramach encji.

 0
Author: s Jagathish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 11:32:20

Ja również stanąłem przed tym samym problemem. Zaktualizowałem mój .edmx z bazy danych po tym wyjątek zniknął.

 0
Author: HariChintha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-04 19:01:35