Wystąpił ten błąd podczas inicjowania mojej bazy danych przy pierwszym podejściu do kodu.
Sprawdzanie poprawności nie powiodło się dla jednego lub więcej podmiotów. Aby uzyskać więcej informacji, zobacz właściwość „EntityValidationErrors”.
Szczerze mówiąc, nie wiem, jak sprawdzić zawartość błędów sprawdzania poprawności. Visual Studio pokazuje mi, że jest to tablica z 8 obiektami, więc 8 błędów sprawdzania poprawności.
Działało to z moim poprzednim modelem, ale wprowadziłem kilka zmian, które wyjaśniam poniżej:
- Miałem wyliczenie o nazwie Status, zmieniłem je 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 zgłaszany w ostatnim wierszu następującego 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
}
}
}
źródło
Console.WriteLine
, szacuję więcej ludzi pisania projektów internetowych następnie pocieszyć aplikacje w dzisiejszych czasach, aDebug.Write
działa w obie ...Możesz to zrobić w programie Visual Studio podczas debugowania bez pisania kodu, nawet bloku catch.
Wystarczy dodać zegarek o nazwie:
Wyrażenie obserwacyjne
$exception
wyświetla każdy wyjątek zgłoszony w bieżącym kontekście, nawet jeśli nie został złapany i przypisany do zmiennej.Na podstawie http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
źródło
Może to faktycznie zrobić bez konieczności pisania kodu:
W swoim bloku catch dodaj punkt przerwania w następującym wierszu kodu:
Teraz, jeśli umieścisz
exception
wskaźnik myszy lub dodasz go,Watch
a następnie przejdziesz do szczegółów wyjątku, jak pokazano poniżej; zobaczysz, które kolumny powodują problem, ponieważ ten błąd zwykle występuje, gdy naruszone jest ograniczenie tabeli.Duży obraz
źródło
Oto jak możesz sprawdzić zawartość EntityValidationErrors w Visual Studio (bez pisania dodatkowego kodu), tj. Podczas debugowania w IDE .
Problem?
Masz rację, wyskakujące okienko Wyświetl szczegóły debugera programu Visual Studio nie pokazuje rzeczywistych błędów w
EntityValidationErrors
kolekcji.Rozwiązanie!
Wystarczy dodać następujące wyrażenie w oknie Szybki podgląd i kliknąć Ponownie oszacuj .
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
W moim przypadku, zobaczyć, jak jestem w stanie ekspansji na
ValidationErrors
List
wewnątrzEntityValidationErrors
kolekcjiOdnośniki: post na blogu mattrandle.me , odpowiedź @ yoel
źródło
Aby szybko zobaczyć pierwszy błąd bez dodawania zegarka, możesz go wkleić w oknie natychmiastowym:
źródło
Dla każdego, kto pracuje
VB.NET
źródło
W trybie debugowania w
catch {...}
bloku 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 próbujesz / złapiesz lub nie masz dostępu do obiektu wyjątku.
To pozwoli ci zejść do
ValidationErrors
drzewa. To najłatwiejszy sposób, w jaki udało mi się uzyskać natychmiastowy wgląd w te błędy.źródło
Jeśli po prostu wychwytujesz ogólny wyjątek, skorzystanie z niego może być przydatne jako wyjątek DbEntityValidationException . Ten typ wyjątku ma właściwość Błędy sprawdzania poprawności, a przy dalszym rozszerzaniu się na nie znajdziesz wszystkie problemy.
Na przykład, jeśli umieścisz punkt przerwania w zaczepie, możesz wrzucić do zegarka:
Przykładem błędu jest to, że jeśli pole nie dopuszcza wartości zerowych, a masz ciąg zerowy, zobaczysz, że pole jest wymagane.
źródło
wystarczy sprawdzić długość pola tabeli bazy danych. Tekst wejściowy jest większy niż długość typu danych pola kolumny
źródło
W debugowaniu możesz wprowadzić to w polu wprowadzania oceny wyrażeń QuickWatch:
źródło
Odpowiedź z @Slauma jest naprawdę świetna, ale okazało się, że nie działała, gdy właściwość ComplexType była nieprawidłowa.
Załóżmy na przykład, że masz właściwość
Phone
typu złożonegoPhoneNumber
. JeśliAreaCode
właściwość jest nieprawidłowa, nazwa właściwości wve.PropertyNames
to „Phone.AreaCode”. Powodujeeve.Entry.CurrentValues<object>(ve.PropertyName)
to niepowodzenie połączenia.Aby to naprawić, możesz podzielić nazwę właściwości dla każdej z nich
.
, a następnie ponownie przejrzeć wynikową tablicę nazw właściwości. Wreszcie, gdy dojdziesz do dolnej części łańcucha, możesz po prostu zwrócić wartość nieruchomości.Poniżej znajduje się
FormattedDbEntityValidationException
klasa @ Slauma ze wsparciem dla ComplexTypes.Cieszyć się!
źródło
Zauważ, że
Entity.GetType().BaseType.Name
podaje nazwę typu, którą określiłeś, a nie tę ze wszystkimi cyframi szesnastkowymi w jej nazwie.źródło
Na odpowiedź @ Slauma i sugestię @ Miltona rozszerzyłem niestandardową metodę składowania naszej klasy podstawowej o try / catch, który poradzi sobie (i tym samym zaloguje się przy logowaniu błędów!) Tego rodzaju wyjątki.
źródło
Musiałem napisać to w oknie natychmiastowym: 3
aby zagłębić się w dokładny błąd!
źródło
Korzystając z odpowiedzi @Slauma, stworzyłem fragment kodu (otacza go fragmentem) dla lepszego wykorzystania.
źródło
Złap wyjątek w try catch, a następnie szybko obejrzyj lub ctrl + d & ctrl + q i możesz przejść do szczegółów EntityValidationErrors.
źródło
Wrzucam tylko dwa centy ...
W moim pliku dbConfiguration.cs lubię zawijać metodę context.SaveChanges () w try / catch i produkować wyjściowy plik tekstowy, który pozwala mi na wyraźne odczytanie błędów (błędów), a ten kod także znaczniki czasowe - przydatne, jeśli napotkasz więcej niż jeden błąd w różnych momentach!
źródło
Znalazłem ... kiedy dostaję błąd „EntityValidationErrors”, to… mam pole w mojej bazie danych „db1” w tabeli „tbladdress” jako „adres1”, który ma rozmiar 100 (tj. Adres varchar (100) null), a ja przekazywałam wartość ponad 100 znaków, co prowadziło do błędu podczas zapisywania danych w bazie danych ....
Musisz więc sprawdzić dane, które przekazujesz na pole.
źródło
not null
kolumny, więc kiedy dodałem dane do wszystkich elementów przed moim,db.SaveChanges()
nie otrzymałem błędu.To działa dla mnie.
Umieść punkt przerwania w instrukcji if. Następnie możesz sprawdzić modelState w oknach debugowania. Przy każdej wartości możesz zobaczyć, czy wystąpił błąd, a nawet komunikat o błędzie. Otóż to. Kiedy już go nie potrzebujesz, po prostu usuń lub skomentuj wiersz.
Mam nadzieję, że to pomoże.
Na żądanie mogę podać szczegółowy zrzut ekranu w oknie debugowania.
źródło
Jak wspomniano w innych postach, wystarczy złapać wyjątek w klasie DbEntityValidationException. Co da ci wszystko, czego potrzebujesz w przypadkach błędów.
źródło
Wcześniej spotkałem się z tym błędem
kiedy próbowałem zaktualizować określone pole w moim modelu w ramach encji
i zgodnie z powyższymi odpowiedziami
Znalazłem komunikat Walidacja
The SignerName field is required.
które wskazują na pole w moim modelu
a kiedy sprawdziłem schemat bazy danych, znalazłem
więc off coure
ValidationException
ma prawo podbići zgodnie z tym polem chcę, aby było zerowalne, (nie wiem jak to pomieszałem)
więc zmieniłem to pole, aby zezwolić na Null, i dzięki temu mój kod nie wyświetli mi tego błędu ponownie
źródło
DbEntityValidationException
podniesione.Sprawdź przekazywaną wartość pól, czy są prawidłowe i zgodne z polami bazy danych. Na przykład liczba znaków przekazywanych w danym polu jest mniejsza niż liczba znaków zdefiniowanych w polu tabeli bazy danych.
źródło
Jeśli korzystasz z IIS z Windows Authentification and Entity Framework , bądź ostrożny
authorize
.Starałem się
POST
bez zgody i to nie działa, a ten błąd nadb.SaveChangesAsync();
, podczas gdy wszystkie inne czasownikiGET
iDELETE
pracowali.Ale kiedy dodałem AuthorizeAttribute jako adnotację, zadziałało.
źródło
Oto inny sposób, aby to zrobić zamiast używać pętli foreach do wyszukiwania wewnątrz EntityValidationErrors. Oczywiście możesz sformatować wiadomość według własnych upodobań:
źródło
W moim przypadku było tak, ponieważ długość pola bazy danych jest mniejsza niż długość pola wejściowego.
tabela bazy danych
Mój wkład
wartość
Username
length
wynosi 5, czylilessthan
6... to może komuś pomóc
źródło
Sprawdź, czy masz
Not Null
ograniczenia w kolumnach tabeli i czy nie przekazujesz wartości dla tej kolumny podczas operacji wstawiania / aktualizacji. To powoduje ten wyjątek w strukturze encji.źródło
Też napotkałem ten sam problem. Zaktualizowałem mój plik .edmx z bazy danych po tym, jak wyjątek zniknął.
źródło
Ten błąd występuje głównie z powodu wielkości pola. SPRAWDŹ wszystkie rozmiary pól w tabeli bazy danych.
źródło
Walczył również z tym błędem i na podstawie tematu tutaj i ta odpowiedź była w stanie wymyślić fragment do skopiowania / wklejenia bez potrzeby określania, co należy zaimportować (doskonałe dla początkujących w języku C #), kod poniżej:
źródło