2016-11-28 65 views
2

我寫了一個相當簡單的代碼(基於WCF和Windows窗體的客戶端服務器)。我試圖更新數據庫,這樣我可以測試我的代碼和我得到一個異常:savechanges方法內的'System.Data.Entity.Infrastructure.DbUpdateException'

「System.Data.Entity.Infrastructure.DbUpdateException」發生在 EntityFramework.dll 任何想法如何解決它?

這裏是我的代碼:

public void updateTable() 
     { 
     using (var db = new overlayDBEntities()) 
     { 
      var overlaydb = new overlayData 
      { 
       DeviceId = "1111", 
       TimestampUTC = new DateTime(2015, 1, 1, 1, 1, 1), 
       OverlayData1 = "eddy and budu" 
      }; 

      db.overlayData.Add(overlaydb); 

      try 
      { 
       db.SaveChanges(); 
      } 
      catch(Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      var overlaydb1 = new overlayData 
      { 
       DeviceId = "1111", 
       TimestampUTC = new DateTime(2000, 2, 2, 10, 10, 10), 
       OverlayData1 = "dumm2sec dumm2sec " 
      }; 

      db.overlayData.Add(overlaydb); 

      try 
      { 
       db.SaveChanges(); 
      } 
      catch (Exception ec) 
      { 
       Console.WriteLine(ec.Message); 
      } 
     } 
    } 
+0

1.如果是異常的方法,你有一個以上的。 'SaveChanges'電話在這裏? 2.什麼是完整的異常信息? – DavidG

+0

您應該調試您的代碼並查看InnerException,它會讓您更好地瞭解問題所在。我懷疑它可能是多個實體具有相同的ID(重複鍵) – benjrb

+0

請注意,「overlaydb1」不會添加到db.overlayData。您正在添加「overlaydb」兩次。 – JoaoRibeiro

回答

2

編寫調用的SaveChanges()的方法,做在那裏,你的錯誤檢查。這會給你一個描述性的錯誤,你可以找出導致錯誤的原因。此外,還有幾個錯誤,他們都需要不同的處理。這是我有的。我已經包含了另一個非常有用的方法,它具有內部異常並遞歸執行。那個在底部列出。我希望這有助於:

public virtual void Save() 
    { 

     try 
     { 
      _db.SaveChanges(); 
     } 
     catch (DbEntityValidationException e) 
     { 
      List<String> lstErrors = new List<string>(); 
      foreach (var eve in e.EntityValidationErrors) 
      { 
       string msg = string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
        eve.Entry.Entity.GetType().Name, 
        eve.Entry.State); 

       lstErrors.Add(msg); 

       foreach (var ve in eve.ValidationErrors) 
       { 
        msg = string.Format("- Property: \"{0}\", Error: \"{1}\"", 
         ve.PropertyName, ve.ErrorMessage); 
        lstErrors.Add(msg); 
       } 
      } 

      if(lstErrors != null && lstErrors.Count() > 0) 
      { 
       StringBuilder sb = new StringBuilder(); 
       foreach (var item in lstErrors) 
       { 
        sb.Append(item + "; "); 
       } 

       throw new Exception("Repository.Save. Db Entity Validation Exception. Data not saved. Error: " + sb.ToString()); 

      } 

      throw new Exception("Repository.Save. Db Entity Validation Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 
     } 

     catch (NotSupportedException e) 
     { 

      throw new Exception("Repository.Save. Not supported Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 
     } 


     catch (ObjectDisposedException e) 
     { 

      throw new Exception("Repository.Save. Repository.Save. Object Disposed Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 

     } 

     catch (InvalidOperationException e) 
     { 
      throw new Exception("Repository.Save. Invalid Operation Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 
     } 

     catch (DbUpdateConcurrencyException e) 
     { 
      throw new Exception("Repository.Save. Db Update Concurrency Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 
     } 

     catch (DbUpdateException e) 
     { 
      throw new Exception("Repository.Save. Db Update Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 
     } 

     catch (EntityException e) 
     { 
      throw new Exception("Repository.Save. Entity Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 
     } 

     catch (DataException e) 
     { 
      throw new Exception("Repository.Save. Data Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 
     } 

     catch (Exception e) 
     { 
      throw new Exception("Repository.Save. General Exception. Data not saved. Error: " + AliKuli.Utilities.ExceptionNS.ErrorMsgClass.GetInnerException(e)); 

     } 
    } 

下面是獲取內部異常...非常有用

/// <summary> 
    /// This sets up the recursive function 
    /// </summary> 
    /// <param name="e"></param> 
    /// <returns></returns> 
    public static string GetInnerException(Exception e) 
    { 
     string innerExceptionMessage = ""; 
     string error = GetInnerException(e, out innerExceptionMessage); 

     return error; 

    } 


/// <summary> 
    /// This is a recursive function which recursively drills down and gets the error. 
    /// </summary> 
    /// <param name="e"></param> 
    /// <param name="msg"></param> 
    /// <returns></returns> 
    private static string GetInnerException(Exception e, out string msg) 
    { 
     if (e.InnerException != null) 
      GetInnerException(e.InnerException, out msg); 
     else 
      msg = e.Message; 
     return msg; 
    } 
相關問題