为什么EF 6.01没有给我一个DbEntityValidationException异常?

时间:2014-07-11 13:53:51

标签: entity-framework-6 sqlexception

当我通过EF 6.01 SaveChanges更新我的SQL 2012数据库时,如果字符串字段太长,我会得到预期的异常。我想要做的是钻进Exception以找到有问题的表和列,因为最里面的SqlException只是告诉我 -

  

字符串或二进制数据将被截断。

但不是哪个列或表。我有下面的代码准备好告诉我任何验证错误,但是没有得到这样的例外。

catch (DbEntityValidationException dbEx)
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
}

我得到的Exception嵌套为DbUpdateException,其中包含一个包含SqlException的UpdateException,并且这些都没有任何列信息。为什么我没有得到DbEntityValidationException?有没有其他方法可以找到有问题的专栏?

2 个答案:

答案 0 :(得分:1)

您获得的此异常直接来自SQL,通过实体框架传递。来自MSDN关于DbEntityValidationException

  

表示当实体验证失败时从SaveChanges()抛出的异常。

(强调我自己)。来自实体框架的验证正在传递,但实际的SQL语句失败,因为您传递的数据对于列来说太长了。 SQL不会返回将被截断的列。它只是一个纯文本消息,字符串或二进制数据将被截断。'

您最好的选择是,查看列并确保代码中字符串的长度与您在SQL列中设置的长度相匹配。

答案 1 :(得分:0)

显然没有抛出DbEntityValidationException,因为EF验证由于某种原因没有完成,所以我在执行SaveChanges之前添加了这段代码(通过TxRepository.Commit)并抛出我自己的包含ValidationErrors的自定义EfValidationException(如果有的话)。我已经测试了,这可以让我记录有问题的列。

            // validate the changes
            var lTxValidationErrors = TxRepository.mDbContext.GetValidationErrors();
            if (lTxValidationErrors.Count() > 0)
            {
                // these changes will not commit so throw an error
                throw new EfValidationException(lTxValidationErrors);
            }
            else
            {
                // commit the new data to the database
                TxRepository.Commit();
            }