Najłatwiejszym rozwiązaniem jest zastąpienie SaveChanges
klasy encji. Możesz złapać DbEntityValidationException
, rozpakować rzeczywiste błędy i utworzyć nowy DbEntityValidationException
z ulepszonym komunikatem.
- Utwórz klasę częściową obok pliku SomethingSomething.Context.cs.
- Użyj kodu na dole tego postu.
- Otóż to. Twoja implementacja automatycznie użyje zastąpionego SaveChanges bez żadnej pracy refaktoryzacyjnej.
Twoja wiadomość o wyjątku będzie teraz wyglądać następująco:
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łędy sprawdzania poprawności to: Pole PhoneNumber musi być ciągiem lub tablicą o maksymalnej długości „12”; Pole LastName jest wymagane.
Możesz upuścić zastąpione SaveChanges w dowolnej klasie, która dziedziczy DbContext
:
public partial class SomethingSomethingEntities
{
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
// Throw a new DbEntityValidationException with the improved exception message.
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
}
DbEntityValidationException
Zawiera również podmioty, które spowodowały błędy sprawdzania poprawności. Jeśli więc potrzebujesz jeszcze więcej informacji, możesz zmienić powyższy kod, aby wyświetlać informacje o tych obiektach.
Zobacz także: http://devillers.nl/improving-dbentityvalidationexception/
using System.Linq;
Jak wskazał Martin, więcej informacji znajduje się w
DbEntityValidationResult
. Uznałem, że przydatne jest uzyskanie zarówno nazwy mojej klasy POCO, jak i nazwy właściwości w każdej wiadomości, i chciałem w tym celu uniknąć konieczności pisania niestandardowychErrorMessage
atrybutów na wszystkich moich[Required]
tagach.Poniższe poprawki w kodzie Martina zadbały o te szczegóły:
źródło
SelectMany and Aggregate
w github przez Daring CodersAby wyświetlić
EntityValidationErrors
kolekcję, dodaj następujące wyrażenie Watch do okna Watch.Używam visual studio 2013
źródło
W trybie debugowania w
catch {...}
bloku otwórz okno „QuickWatch” ( ctrl+ alt+ q) i wklej tam:Pozwoli ci to zejść do
ValidationErrors
drzewa. To najłatwiejszy sposób na uzyskanie natychmiastowego wglądu w te błędy.Dla użytkowników Visual 2012+, którym zależy tylko na pierwszym błędzie i którzy mogą nie mieć
catch
bloku, możesz nawet:źródło
Aby szybko znaleźć znaczący komunikat o błędzie, sprawdzając błąd podczas debugowania:
Dodaj szybki zegarek dla:
Przeanalizuj w EntityValidationErrors takie jak to:
(element kolekcji np. [0])> ValidationErrors> (element kolekcji np. [0])> ErrorMessage
źródło
W rzeczywistości jest to tylko kwestia sprawdzania poprawności, EF najpierw zweryfikuje właściwości encji przed wprowadzeniem jakichkolwiek zmian w bazie danych. Tak więc EF sprawdzi, czy wartość właściwości jest poza zakresem, na przykład podczas projektowania tabeli. Table_Column_UserName to varchar (20). Ale w EF wprowadzono wartość dłuższą niż 20. Lub, w innych przypadkach, jeśli kolumna nie pozwala na wartość Null. Tak więc w procesie sprawdzania poprawności musisz ustawić wartość kolumny niepustej, bez względu na to, czy zamierzasz wprowadzić w niej zmiany. Ja osobiście lubię odpowiedź Leniel Macaferi. Może pokazać szczegóły problemów z weryfikacją
źródło
Myślę, że „rzeczywiste błędy sprawdzania poprawności” mogą zawierać poufne informacje, i może to być powód, dla którego Microsoft zdecydował się umieścić je w innym miejscu (właściwości). Oznaczone tutaj rozwiązanie jest praktyczne, ale należy zachować ostrożność.
Wolałbym stworzyć metodę rozszerzenia. Więcej powodów:
źródło
W przypadku funkcji platformy Azure korzystamy z tego prostego rozszerzenia do Microsoft.Extensions.Logging.ILogger
i przykładowe użycie:
źródło
Użyj try block w swoim kodzie jak
Możesz również sprawdzić szczegóły tutaj
http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
Sprawdzanie poprawności nie powiodło się dla jednego lub więcej podmiotów. Aby uzyskać więcej informacji, zobacz właściwość „EntityValidationErrors”
http://blogs.infosupport.com/improving-dbentityvalidationexception/
źródło