2014-07-11 43 views
1

當我更新我的SQL 2012數據庫通過EF 6.01 SaveChanges,字符串字段太長,我得到一個異常如預期。我想要做的是鑽入異常以查找有問題的表和列,因爲最內層的SqlException僅告訴我 -爲什麼EF 6.01不給我一個DbEntityValidationException異常?

字符串或二進制數據將被截斷。

但不是哪個列或表。我有像下面的代碼準備告訴我任何驗證錯誤,但不要得到這樣的例外。

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); 
     } 
    } 
} 

我得到的異常嵌套爲包含含有這些的SQLEXCEPTION並且沒有一個UpdateException DbUpdateException具有任何列信息。爲什麼我沒有得到DbEntityValidationException?有沒有其他方法可以找到違規列?

回答

1

你得到的這個異常直接來自SQL,通過實體框架傳遞。從MSDN約DbEntityValidationException

代表)從調用SaveChanges(拋出一個異常時,實體的驗證失敗

(強調我自己的)。來自實體框架的驗證已通過,但實際的SQL語句失敗,因爲您傳遞的數據對於列來說太長。 SQL不會返回將被截斷的列。這只是一個純文本消息'字符串或二進制數據將被截斷'。

最好的辦法是,通過列並確保代碼中字符串的長度與您在SQL列中設置的長度相匹配。

+0

在這種情況下,我知道哪個入口導致了問題,但想添加一些代碼,以便將來更容易地告訴我。在給予SQL之前是否有EF驗證條目?我將3個對象添加到上下文中,然後執行SaveChanges。 – Dave

+0

@Dave你在用什麼方法?代碼優先?數據庫第一? –

+0

Steven,我使用Model First,並有一個項目轉換爲Code First,因爲MSFT幾乎放棄了Model First。 – Dave

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(); 
      } 
+0

這對我來說是一種解決方法。如果有人能告訴我爲什麼我沒有首先得到DbEntityValidationException,爲什麼有時候會有人得到這個異常,從其他帖子中可以看出,我寧願將他們的迴應標記爲答案。 – Dave

相關問題