当我通过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?有没有其他方法可以找到有问题的专栏?
答案 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();
}