DbEntityValidationException mehr Details

von

in

Es ist wichtig zu wissen, dass ein db.SaveChanges(); nur etwas an der Datenbank ändert, wenn sich auch ein Wert wirklich geändert hat. So kann also eine Exception bei db.UserSet.First().LastLogin = DateTime.Now; db.SaveChanges(); auftreten und mit dieser Zeile auskommentiert alles funktionieren, obwohl da ebenfalls Werte am user geändert werden (jedoch mit denen in der Db übereinstimmen). Das EF ist also so gescheit und speichert nur, wenn die Properties anders sind als in der Datenbank und mit DateTime.Now ist es immer anders.

Lange Rede kurzer Sinn, das Debuggen einer DbEntityValidationException kann mitunter schwierig werden, besonders wenn man den Code nicht im Debugmodus ausführt.

Hier hilft dieses Codesnippet, das man statt db.SaveChanges(); temporär verwenden kann um mehr Details zu sehen:

using(DbModel db = new DbModel)
{
	//do db.MyEntity changes and then try catch db.SaveChanges()

	try
	{
		db.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);
	}
}

Thanks to: Stackoverflow Antwort


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert