![](/img/trans.png)
[英]System.Data.Entity.Infrastructure.DbUpdateException on recursive Tree method
[英]'System.Data.Entity.Infrastructure.DbUpdateException' within savechanges method
我寫了一個相當簡單的代碼(基於WCF和Windows窗體的客戶端服務器)。 我試圖更新數據庫,以便可以測試我的代碼,但出現異常:
EntityFramework.dll中發生了'System.Data.Entity.Infrastructure.DbUpdateException'有什么想法如何解決?
這是我的代碼:
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);
}
}
}
編寫一個調用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.