DbEntityValidationException

DbEntityValidationException

本文介绍了DbEntityValidationException - 我怎么能轻松地告诉是什么原因造成的错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用实体框架的项目。同时呼吁的SaveChanges 我的的DbContext ,我得到了以下异常:

I have a project that uses Entity Framework. While calling SaveChanges on my DbContext, I get the following exception:

System.Data.Entity.Validation.DbEntityValidationException:验证
  失败的一个或多个实体。见'EntityValidationErrors属性
  了解更多详情。

这是所有罚款和花花公子,但我不希望每到这个异常发生时,附加一个调试器。更结束了,在生产环境中我不能轻易地附加一个调试器,所以我必须竭尽全力来重现这些错误。

This is all fine and dandy, but I don't want to attach a debugger every time this exception occurs. More over, in production environments I cannot easily attach a debugger so I have to go to great lengths to reproduce these errors.

我怎么能看到隐藏在细节 DbEntityValidationException

How can I see the details hidden within the DbEntityValidationException?

推荐答案

最简单的办法是重写的SaveChanges 在你的实体类。您可以赶上 DbEntityValidationException ,解开实际的错误,并创建一个新的 DbEntityValidationException 通过改善信息。

The easiest solution is to override SaveChanges on your entities class. You can catch the DbEntityValidationException, unwrap the actual errors and create a new DbEntityValidationException with the improved message.


  1. 创建旁边的SomethingSomething.Context.cs文件的分部类。

  2. 使用code。在这篇文章的底部。

  3. 就是这样。你的实现将自动使用被覆盖的调用SaveChanges没有任何重构的工作。

您的异常消息现在看起来是这样的:

Your exception message will now look like this:

System.Data.Entity.Validation.DbEntityValidationException:验证
  失败的一个或多个实体。见'EntityValidationErrors属性
  更多细节。验证错误是:该字段******中国
  必须是一个字符串或数组类型以'12'的最大长度;该
  姓氏字段是必需的。

您可以从任何继承类删除重写的SaveChanges 的DbContext

You can drop the overridden SaveChanges in any class that inherits from 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 还包含导致验证错误的实体。所以,如果你需要更多的信息,您可以更改上述code至这些实体输出信息。

The DbEntityValidationException also contains the entities that caused the validation errors. So if you require even more information, you can change the above code to output information about these entities.

参见:http://devillers.nl/improving-dbentityvalidationexception/

这篇关于DbEntityValidationException - 我怎么能轻松地告诉是什么原因造成的错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-23 18:39