340 Stimmen

Validierung für eine oder mehrere Entitäten beim Speichern von Änderungen in der SQL Server-Datenbank mit Entity Framework fehlgeschlagen

Ich möchte meine bearbeiten, um Datenbank zu speichern und ich bin mit Entity FrameWork Code-First in ASP.NET MVC 3 / C#, aber ich bin immer Fehler. In meiner Ereignisklasse habe ich die Datentypen DateTime und TimeSpan, aber in meiner Datenbank habe ich Datum bzw. Uhrzeit. Könnte dies der Grund sein? Wie kann ich vor dem Speichern von Änderungen in der Datenbank den entsprechenden Datentyp im Code verwenden?

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

Methode in der Steuerung >>>> Problem bei 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);
    }
}

mit

public class EventCalendarEntities : DbContext
{
    public DbSet<Event> Events { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Place> Places { get; set; } 
}

SQL Server 2008 R2 Datenbank / T-SQL

EventDate (Datatype = date)  
StartTime (Datatype = time)  
EndTime (Datatype = time)  

Http-Formular

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  

Serverfehler in der Anwendung '/'.

Validierung für eine oder mehrere Entitäten fehlgeschlagen. Siehe Eigenschaft 'EntityValidationErrors' für weitere Details.

Beschreibung: Während der Ausführung der aktuellen Webanfrage ist eine unbehandelte Ausnahme aufgetreten. Bitte überprüfen Sie den Stack-Trace für weitere Informationen über den Fehler und wo er im Code entstanden ist.

Details zur Ausnahme: System.Data.Entity.Validation.DbEntityValidationException: Validierung für eine oder mehrere Entitäten fehlgeschlagen. Siehe Eigenschaft 'EntityValidationErrors' für weitere Details.

Fehlerquelle:

Line 75:             if (TryUpdateModel(theEvent))
Line 76:             {
Line 77:                 storeDB.SaveChanges();
Line 78:                 return RedirectToAction("Index");
Line 79:             }

Quelldatei: C:\sep\MvcEventCalendar\MvcEventCalendar\Controllers\EventManagerController.cs Zeile: 77

Stack Trace:

[DbEntityValidationException: Validierung für eine oder mehrere Entitäten fehlgeschlagen. Siehe Eigenschaft 'EntityValidationErrors' für weitere Details].

2voto

laylarenee Punkte 3226

Dieser Fehler tritt auch auf, wenn Sie versuchen, eine Entität zu speichern, die Validierungsfehler aufweist. Eine gute Möglichkeit, dies zu verursachen, ist zu vergessen, ModelState.IsValid zu überprüfen, bevor Sie in Ihrer DB speichern.

2voto

user4030144 Punkte 41

Vergewissern Sie sich, dass Sie, wenn Sie nvarchar(50) in der DB-Zeile haben, nicht versuchen, mehr als 50 Zeichen in diese Zeile einzufügen. Ein dummer Fehler, aber ich habe 3 Stunden gebraucht, um es herauszufinden.

1voto

Es kann durch Eigenschaft verursacht werden, die nicht durch Modell befüllt wird.. stattdessen wird es durch Controller befüllt.. die diesen Fehler verursachen kann.. Lösung zu diesem ist die Eigenschaft vor der Anwendung ModelState Validierung zuweisen. und diese zweite Annahme ist. Sie können bereits Daten in Ihrer Datenbank haben und versuchen, sie zu aktualisieren, aber jetzt holen Sie sie ab.

1voto

lokopi Punkte 101

Dies könnte auf die maximale Anzahl von Zeichen zurückzuführen sein, die für eine bestimmte Spalte zulässig sind, z. B. könnte ein Feld in Sql folgenden Datentyp haben nvarchar(5) aber die Anzahl der vom Benutzer eingegebenen Zeichen ist größer als die angegebene, daher tritt der Fehler auf.

1voto

Exatex Punkte 339

Vielen Dank für Ihre Antworten, sie helfen mir sehr. wie ich Code in Vb.Net, dieser Bolt Code für Vb.Net

Try
   Return MyBase.SaveChanges()
Catch dbEx As Validation.DbEntityValidationException
   For Each [error] In From validationErrors In dbEx.EntityValidationErrors
                       From validationError In validationErrors.ValidationErrors
                       Select New With { .PropertyName = validationError.PropertyName,
                                         .ErrorMessage = validationError.ErrorMessage,
                                         .ClassFullName = validationErrors.Entry.Entity
                                                                    .GetType().FullName}

        Diagnostics.Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                           [error].ClassFullName,
                                           [error].PropertyName,
                                           [error].ErrorMessage)
   Next
   Throw
End Try

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X