2013-05-02 63 views
6

實體框架在異常中爲我提供了通用消息,但沒有告訴我導致錯誤的確切實體和屬性。我如何獲得有關錯誤的更多信息?找出在實體框架中導致異常的確切實體

這發生在許多情況下,如

操作失敗:關係不能被改變,因爲一個或多個外鍵的屬性是不可爲空。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。

一個DATETIME2數據類型爲datetime數據類型的轉換導致外的範圍內的值。該語句已終止。

異常詳細信息:

[SQLEXCEPTION(0x80131904):一個DATETIME2數據類型爲datetime數據類型的轉換導致外的範圍內的值。 該語句已終止。] System.Data.SqlClient.SqlConnection.OnError(SqlException異常,布爾breakConnection)404 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()412 System.Data.SqlClient.TdsParser。運行(runBehavior runBehavior,SqlCommand的cmdHandler,SqlDataReader的數據流,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)2660 System.Data.SqlClient.SqlDataReader.ConsumeMetaData()+59 System.Data.SqlClient.SqlDataReader.get_MetaData()+118 系統。 Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)+6431425 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior ,布爾returnStream,布爾異步)+6432994 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result)+538 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior ,RunBehavior runBehavior,布爾returnStream,String方法)+28 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior行爲,String方法)+256 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior行爲)+19 系統。 Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator轉換器,EntityConnection連接,字典2 identifierValues, List 1 generatedValues)+270 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManag er stateManager,IEntityAdapter適配器)+391

[UpdateException:更新條目時發生錯誤。有關詳細信息,請參閱內部異常。] System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)+11223976 System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)+833 系統。 Data.Entity.Internal.InternalContext.SaveChanges()+218

[DbUpdateException:更新條目時發生錯誤。有關詳細信息,請參閱內部例外。] System.Data.Entity。Internal.InternalContext.SaveChanges()+291

+0

多少地方,你使用'Datetime2'?閱讀[this](http://stackoverflow.com/a/1334193/1466627)。 – 2013-05-03 13:40:10

回答

7

下面是我在我的解決方案的代碼:

try 
{ 
    _context.SaveChanges(); 
} 
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) 
{ 
    Exception raise = dbEx; 
    foreach (var validationErrors in dbEx.EntityValidationErrors) 
    { 
     foreach (var validationError in validationErrors.ValidationErrors) 
     { 
      string message = string.Format("{0}:{1}", validationErrors.Entry.Entity.ToString(), validationError.ErrorMessage); 
      //raise a new exception inserting the current one as the InnerException 
      raise = new InvalidOperationException(message , raise); 
     } 
    } 
    throw raise; 
} 

你可以使用它作爲基礎,添加到您的解決方案......它建立一個嵌套包含實體框架中所有細節的一組異常。

+0

我認爲這對於第一個錯誤是好的,但對於第二個錯誤我沒有得到'DbEntityValidationException'我得到這個:'[DbUpdateException:更新條目時發生錯誤。細節見內部例外。] – chadisbad 2013-05-03 03:21:11

+0

@chadisbad內部例外說什麼? – qujck 2013-05-03 08:09:23

+0

內部異常是'將datetime2數據類型轉換爲日期時間數據類型導致超出範圍的值。該聲明已被終止。「我想知道是否可以找出導致異常的特定實體和屬性(列)。 – chadisbad 2013-05-03 12:52:15

1

你需要編寫測試的存儲庫和基類爲您的測試:

try 
{ 
    DbContext.SaveChanges(); 
} 
catch (DbEntityValidationException e) 
{ 
    e.EntityValidationErrors.SelectMany(error => error.ValidationErrors).ToList().ForEach(
    item => Console.WriteLine("{0} - {1}", item.PropertyName, item.ErrorMessage)); 
    throw; 
} 
+0

以上解決方案對於MySql數據庫不起作用。由於MySql連接器拋出類型爲MySql.Data.MySqlClient.MySqlException的異常。任何想法在這種情況下可以做什麼? – 2017-11-16 08:18:18