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/
using System.Linq;
Como Martin indicou, há mais informações no
DbEntityValidationResult
. Achei útil obter o nome da classe POCO e o nome da propriedade em cada mensagem e queria evitar a necessidade de escreverErrorMessage
atributos personalizados em todas as minhas[Required]
tags apenas para isso.O seguinte ajuste no código de Martin cuidou desses detalhes para mim:
fonte
SelectMany and Aggregate
no github por Daring CodersPara visualizar a
EntityValidationErrors
coleção, adicione a seguinte expressão Watch à janela Watch.Eu estou usando o visual studio 2013
fonte
Enquanto você estiver no modo de depuração dentro do
catch {...}
bloco, abra a janela "QuickWatch" ( ctrl+ alt+ q) e cole nela:Isso permitirá que você faça uma busca detalhada no
ValidationErrors
árvore. É a maneira mais fácil que eu encontrei de obter informações instantâneas sobre esses erros.Para usuários do Visual 2012+ que se preocupam apenas com o primeiro erro e podem não ter um
catch
bloqueio, você pode até fazer:fonte
Para encontrar rapidamente uma mensagem de erro significativa, inspecionando o erro durante a depuração:
Adicione uma observação rápida para:
Faça uma busca detalhada em EntityValidationErrors assim:
(item de coleção, por exemplo, [0])> ValidationErrors> (item de coleção, por exemplo, [0])> ErrorMessage
fonte
Na verdade, esse é apenas um problema de validação, a EF validará as propriedades da entidade primeiro antes de fazer alterações no banco de dados. Portanto, a EF verificará se o valor da propriedade está fora do intervalo, como quando você projetou a tabela. Table_Column_UserName é varchar (20). Mas, no EF, você inseriu um valor maior que 20. Ou, em outros casos, se a coluna não permitir que seja Nulo. Portanto, no processo de validação, você deve definir um valor para a coluna não nula, independentemente de fazer a alteração. Pessoalmente, gosto da resposta de Leniel Macaferi. Pode mostrar os detalhes dos problemas de validação
fonte
Penso que "os erros de validação reais" podem conter informações confidenciais e esse pode ser o motivo pelo qual a Microsoft optou por colocá-los em outro local (propriedades). A solução marcada aqui é prática, mas deve ser tomada com cautela.
Eu preferiria criar um método de extensão. Mais razões para isso:
fonte
Para o Azure Functions, usamos esta extensão simples para Microsoft.Extensions.Logging.ILogger
e exemplo de uso:
fonte
Use o bloco try no seu código como
Você pode verificar os detalhes aqui também
http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
Falha na validação para uma ou mais entidades. Consulte a propriedade 'EntityValidationErrors' para obter mais detalhes
http://blogs.infosupport.com/improving-dbentityvalidationexception/
fonte