Chcę zapisać moją edycję w bazie danych i używam Entity FrameWork Code-First w ASP.NET MVC 3 / C #, ale dostaję błędy. W mojej klasie Event mam typy danych DateTime i TimeSpan, ale w mojej bazie danych mam odpowiednio datę i godzinę. Czy to może być powód? Jak mogę rzutować na odpowiedni typ danych w kodzie przed zapisaniem zmian w bazie danych.
public class Event
{
public int EventId { get; set; }
public int CategoryId { get; set; }
public int PlaceId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public DateTime EventDate { get; set; }
public TimeSpan StartTime { get; set; }
public TimeSpan EndTime { get; set; }
public string Description { get; set; }
public string EventPlaceUrl { get; set; }
public Category Category { get; set; }
public Place Place { get; set; }
}
Metoda w kontrolerze >>>> Problem w storeDB.SaveChanges ();
// POST: /EventManager/Edit/386
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
var theEvent = storeDB.Events.Find(id);
if (TryUpdateModel(theEvent))
{
storeDB.SaveChanges();
return RedirectToAction("Index");
}
else
{
ViewBag.Categories = storeDB.Categories.OrderBy(g => g.Name).ToList();
ViewBag.Places = storeDB.Places.OrderBy(a => a.Name).ToList();
return View(theEvent);
}
}
z
public class EventCalendarEntities : DbContext
{
public DbSet<Event> Events { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Place> Places { get; set; }
}
Baza danych SQL Server 2008 R2 / T-SQL
EventDate (Datatype = date)
StartTime (Datatype = time)
EndTime (Datatype = time)
Formularz HTTP
EventDate (Datatype = DateTime) e.g. 4/8/2011 12:00:00 AM
StartTime (Datatype = Timespan/time not sure) e.g. 08:30:00
EndTime (Datatype = Timespan/time not sure) e.g. 09:00:00
Błąd serwera w aplikacji „/”.
Sprawdzanie poprawności nie powiodło się dla jednego lub więcej podmiotów. Aby uzyskać więcej informacji, zobacz właściwość „EntityValidationErrors”.
Opis: Wystąpił nieobsługiwany wyjątek podczas wykonywania bieżącego żądania internetowego. Przejrzyj dane śledzenia stosu, aby uzyskać więcej informacji o błędzie i jego źródle w kodzie.
Szczegóły wyjątku: System.Data.Entity.Validation.DbEntityValidationException: Walidacja nie powiodła się dla jednego lub więcej podmiotów. Aby uzyskać więcej informacji, zobacz właściwość „EntityValidationErrors”.
Błąd źródła:
Line 75: if (TryUpdateModel(theEvent))
Line 76: {
Line 77: storeDB.SaveChanges();
Line 78: return RedirectToAction("Index");
Line 79: }
Plik źródłowy: C: \ sep \ MvcEventCalendar \ MvcEventCalendar \ Controllers \ EventManagerController.cs Linia: 77
Ślad stosu:
[DbEntityValidationException: Sprawdzanie poprawności nie powiodło się dla jednego lub więcej podmiotów. Więcej informacji można znaleźć we właściwości „EntityValidationErrors”.]
źródło
Odpowiedzi:
Możesz wyodrębnić wszystkie informacje z
DbEntityValidationException
następującego kodu (musisz dodać przestrzenie nazw:System.Data.Entity.Validation
iSystem.Diagnostics
do swojejusing
listy):źródło
Required
.). Dodałem odpowiedź z nieco więcej informacji.Nie wymaga zmiany kodu:
W trybie debugowania w
catch {...}
bloku otwórz okno „QuickWatch” ( Ctrl+ Alt+ Q) i wklej tam:lub:
Jeśli nie próbujesz / złapiesz lub nie masz dostępu do obiektu wyjątku.
Pozwoli ci to zejść do
ValidationErrors
drzewa. To najłatwiejszy sposób na uzyskanie natychmiastowego wglądu w te błędy.źródło
W przypadku klas o takich samych nazwach własności, oto małe rozszerzenie odpowiedzi Praveen:
źródło
Jako ulepszenie zarówno dla Praveen, jak i Tony'ego, używam przesłonięcia:
źródło
Ta implementacja zawija wyjątek encji do wyjątku z tekstem szczegółowym. Obsługuje
DbEntityValidationException
,DbUpdateException
,datetime2
błędy range (MS SQL), a to klucz nieprawidłowych podmiotu w wiadomości (przydatne gdy savind wiele podmiotów w jednejSaveChanges
rozmowy).Po pierwsze, przesłonięcie
SaveChanges
w klasie DbContext:Klasa ExceptionHelper:
źródło
Ten kod pomógł znaleźć mój problem, gdy miałem problem z moim błędem VAlidation jednostki. Podał mi dokładny problem z moją definicją jednostki. Wypróbuj następujący kod, w którym musisz opisać storeDB.SaveChanges (); w dalszej części spróbuj złapać blok.
źródło
Otrzymałem ten błąd dzisiaj i przez jakiś czas nie mogłem go rozwiązać, ale zdałem sobie sprawę, że to po dodaniu niektórych
RequireAttribute
s do moich modeli i że niektóre dane źródłowe programowania nie zapełniają wszystkich wymaganych pól.Warto więc pamiętać, że jeśli pojawia się ten błąd podczas aktualizowania bazy danych za pomocą strategii inicjującej, takiej jak
DropCreateDatabaseIfModelChanges
wtedy, musisz upewnić się, że dane początkowe spełniają i spełniają wszelkie atrybuty sprawdzania poprawności danych modelu .Wiem, że to nieco różni się od problemu w pytaniu, ale jest to popularne pytanie, więc pomyślałem, że dodam trochę więcej do odpowiedzi dla innych, którzy mają ten sam problem jak ja.
Mam nadzieję, że to pomaga innym :)
źródło
Myślę, że dodanie try / catch dla każdej
SaveChanges()
operacji nie jest dobrą praktyką, lepiej jest scentralizować to:Dodaj tę klasę do
DbContext
klasy głównej :Spowoduje to zastąpienie
SaveChanges()
metody kontekstu, a otrzymasz listę oddzieloną przecinkami zawierającą wszystkie błędy sprawdzania poprawności encji.można to również poprawić, rejestrując błędy w środowisku env, zamiast po prostu zgłaszać błąd.
mam nadzieję, że to jest pomocne.
źródło
DbContext
względem swojego projektu.Oto rozszerzenie rozszerzenia Tony'ego ... :-)
W przypadku Entity Framework 4.x, jeśli chcesz uzyskać nazwę i wartość pola klucza, aby wiedzieć, która instancja encji (rekord DB) ma problem, możesz dodać następujące elementy. Zapewnia to dostęp do potężniejszych członków klasy ObjectContext z Twojego obiektu DbContext.
źródło
Nie lubię wyjątków. Zarejestrowałem OnSaveChanges i mam to
źródło
Ten błąd występuje również podczas próby zapisania encji, w której występują błędy sprawdzania poprawności. Dobrym sposobem na spowodowanie tego jest zapomnienie o sprawdzeniu ModelState.IsValid przed zapisaniem do DB.
źródło
Upewnij się, że jeśli masz nvarchar (50) w wierszu DB, nie próbujesz wstawiać do niego więcej niż 50 znaków. Głupia pomyłka, ale zajęło mi to 3 godziny.
źródło
Może to wynikać z maksymalnej liczby znaków dozwolonych dla określonej kolumny, tak jak w sql jedno pole może mieć następujący typ danych,
nvarchar(5)
ale liczba znaków wprowadzonych przez użytkownika jest większa niż określona, dlatego pojawia się błąd.źródło
Kilka dni temu napotkałem ten sam problem podczas aktualizacji bazy danych. W moim przypadku dodano kilka nowych niepustych kolumn do konserwacji, które nie zostały dostarczone w kodzie, który powoduje wyjątek. Zrozumiałem te pola i podałem dla nich wartości i ich rozwiązanie.
źródło
Dziękujemy za odpowiedzi, bardzo mi to pomaga. jak i kod w Vb.Net, ten kod Bolt dla Vb.Net
źródło
może to być spowodowane właściwością, która nie jest wypełniana przez model .. zamiast tego jest wypełniana przez kontroler .. co może powodować ten błąd .. rozwiązaniem tego jest przypisanie właściwości przed zastosowaniem sprawdzania poprawności ModelState. a to drugie założenie jest. być może masz już dane w bazie danych i próbujesz je zaktualizować, ale teraz je pobierasz.
źródło
W moim przypadku mam nazwę kolumny tabeli Ścieżka, której ustawionym typem danych był varchar (200). Po zaktualizowaniu go do nvarchar (max) usunąłem tabelę z edmx, a następnie ponownie dodałem tabelę i poprawnie dla mnie napisała.
źródło