2016-02-15 4 views
5

Czy można zweryfikować elementy, które dodałem do kontekstu, zanim zadzwonię pod numer SaveChanges i usunę te nieprawidłowe, aby nie uzyskać EntityValidationErrors przy składowaniu?Sprawdzanie poprawności elementów przed zapisaniem i usunięciem z kontekstu

Mam listę około 3k podmiotów, a niektóre z nich zawierają nieprawidłowe dane, które uniemożliwiają zapisanie wszystkich innych podmiotów. Nie chciałbym zapisywać każdej jednostki osobno, ale raczej ignorować te, które mają błędy.

Próbując znaleźć rozwiązanie tego problemu, stwierdziłem, że można wyłączyć sprawdzanie poprawności. Gdybym to zrobił, zignorowałbym te nieprawidłowe i zapisał pozostałe?

Context.Configuration.ValidateOnSaveEnabled = false; 

Wolałbym jednak wywołać metodę wywołania sprawdzania jednostki i usunąć ją z kontekstu. A może nawet możliwe jest sprawdzenie jednostki przed dodaniem jej do kontekstu? Byłoby jeszcze lepiej.

Odpowiedz

6

Bezpośrednie rozwiązanie sprawdza je przed zapisaniem i oddziela je od błędów.

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

Ale to bardziej przypomina obejście. IMO powinieneś unikać błędów walidacji wcześniej (np. W warstwie api), zamiast zapobiegać zapisywaniu w warstwie danych.

+0

Tak, mam na myśli to jak obejścia. Zamierzam zarejestrować nieprawidłowe dane i poszukać błędu później, ale byłoby świetnie, gdyby przynajmniej niektóre dane mogły zostać zapisane, w przeciwnym razie jeden nieprawidłowy obiekt paraliżuje cały system. Nie zawsze łatwo jest zapobiec i przewidzieć każdy rodzaj możliwych błędów. To powinno być ostateczne wykrywanie i zapobieganie błędom. – t3chb0t

1

Znajdź właściwości modelu za pomocą 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 
       } 
      } 

Po tym wykluczyć te właściwości, stosując

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

To interesujące podejście. W tej właśnie sytuacji to mi nie pomoże, ale dobrze jest wiedzieć, że mogę wyłączyć określone właściwości. Zapiszę to na przyszłość ;-) – t3chb0t