A solução mais fácil é substituir SaveChanges
a classe de entidades. Você pode capturar DbEntityValidationException
, desembrulhar os erros reais e criar um novo DbEntityValidationException
com a mensagem aprimorada.
- Crie uma classe parcial ao lado do seu arquivo SomethingSomething.Context.cs.
- Use o código na parte inferior desta postagem.
- É isso aí. Sua implementação usará automaticamente as SaveChanges substituídas sem nenhum trabalho de refatoração.
Sua mensagem de exceção será agora assim:
System.Data.Entity.Validation.DbEntityValidationException: falha na validação de uma ou mais entidades. Consulte a propriedade 'EntityValidationErrors' para obter mais detalhes. Os erros de validação são: O campo PhoneNumber deve ser um tipo de sequência ou matriz com um comprimento máximo de '12'; O campo Sobrenome é obrigatório.
Você pode descartar o SaveChanges substituído em qualquer classe que herda de 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);
}
}
}
O DbEntityValidationException
também contém as entidades que causaram os erros de validação. Portanto, se você precisar de mais informações, poderá alterar o código acima para gerar informações sobre essas entidades.
Consulte também: http://devillers.nl/improving-dbentityvalidationexception/