2016-02-15 6 views
5

Ist es möglich, Entitäten zu validieren, die ich bereits dem Kontext hinzugefügt habe, bevor ich SaveChanges aufrufen und die ungültigen entfernen, so dass ich die EntityValidationErrors beim Speichern nicht bekomme?Validieren von Entitäten vor dem Speichern und Entfernen aus dem Kontext

Ich habe eine Liste von etwa 3k Entitäten und einige von ihnen enthalten ungültige Daten, die verhindern, dass alle anderen Entitäten gespeichert werden. Ich möchte nicht jede Entität separat speichern, sondern diejenigen ignorieren, die Fehler enthalten.

Bei dem Versuch, eine Lösung zu finden, habe ich festgestellt, dass Sie die Validierung deaktivieren können. Wenn ich es tun würde, würde SaveChanges die ungültigen ignorieren und die anderen speichern?

Ich würde jedoch lieber eine Methode aufrufen, um die Entitätsprüfung aufzurufen und sie aus dem Kontext zu entfernen. Oder ist es vielleicht sogar möglich, eine Entität zu validieren, bevor ich sie dem Kontext hinzufüge? Das wäre noch besser.

Antwort

6

Die direkte Lösung validiert sie vor dem Speichern und löst diese Entitäten mit Fehlern.

foreach (var error in dbContext.GetValidationErrors()) 
{ 
    dbContext.Entry(error.Entry).State = EntityState.Detached; 
} 

Aber es ist eher wie ein Workaround. IMO sollten Sie die Validierungsfehler früher vermeiden (z. B. in der API-Schicht), anstatt das Speichern in der Datenschicht zu verhindern.

+0

Ja verwendet wird, ich es wie eine Abhilfe bedeuten. Ich werde die ungültigen Daten protokollieren und später nach dem Fehler suchen, aber es wäre großartig, wenn zumindest ein Teil der Daten gespeichert werden könnte, andernfalls lähmt eine ungültige Entität das gesamte System. Es ist nicht immer einfach, jede Art möglicher Fehler zu verhindern und vorherzusagen. Dies sollte die letzte Möglichkeit zur Fehlererkennung und -verhinderung sein. – t3chb0t

1

Suchen nach Modelleigenschaften mit ViewData.ModelState.Errors;

foreach (var item in ViewData.ModelState.Keys) 
      { 
       int err=ViewData.ModelState[item].Errors.Count(); 
       if (err.Equals(1)) 
       { 
        // Add property name in a list 
       } 
      } 

Danach jene Eigenschaften ausschließen

db.Entry(model).State = EntityState.Modified; 
db.Entry(model).Property(x => x.Token).IsModified = false; 
+0

Dies ist ein interessanter Ansatz. In dieser Situation wird es mir nicht helfen, aber es ist gut zu wissen, dass ich bestimmte Eigenschaften deaktivieren kann. Ich werde es für zukünftige Referenz speichern ;-) – t3chb0t

Verwandte Themen