SaveChanges()上的validation错误

我的Asp.net mvc Web应用程序中有以下Action方法: –

[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(SDJoin sdj, FormCollection formValues) { Try { //code goes here repository.InsertOrUpdateSD(sdj.StorageDevice, User.Identity.Name, assetid); repository.Save(); } catch (Exception ex) { //code goes here } PopulateViewBagData(); return View(sdj); } 

它调用以下方法: –

 public void InsertOrUpdateSD(TMSStorageDevice sd, string username, long assetid) { var resource = entities.Resources.AsNoTracking().SingleOrDefault(a => a.RESOURCEID == assetid); if (sd.TMSStorageDeviceID == default(int)) { // New entity int technologyypeID = GetTechnologyTypeID("Storage Device"); Technology technology = new Technology { IsDeleted = true, IsCompleted = false, TypeID = technologyypeID, Tag = "SD" + GetTagMaximumeNumber2(technologyypeID).ToString(), StartDate = DateTime.Now, IT360ID = assetid }; InsertOrUpdateTechnology(technology); Save(); sd.TMSStorageDeviceID = technology.TechnologyID; tms.TMSStorageDevices.Add(sd); } } 

我的模型类如下: –

 public partial class TMSStorageDevice { public int TMSStorageDeviceID { get; set; } public string Name { get; set; } public Nullable size { get; set; } public int RackID { get; set; } public string CustomerName { get; set; } public string Comment { get; set; } public byte[] timestamp { get; set; } public virtual Technology Technology { get; set; } public virtual TMSRack TMSRack { get; set; } } 

但如果我调用Create动作方法,我将得到以下exception: –

 System.Data.Entity.Validation.DbEntityValidationException was caught HResult=-2146232032 Message=Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. Source=EntityFramework StackTrace: at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at System.Data.Entity.DbContext.SaveChanges() at TMS.Models.Repository.Save() in c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Models\Repository.cs:line 1926 at TMS.Controllers.StorageDeviceController.Create(SDJoin sdj, FormCollection formValues) in c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Controllers\StorageDeviceController.cs:line 160 InnerException: 

任何人都可以建议什么是错的,因为我仔细检查我的代码,每件事都应该正常工作? 谢谢

您尚未显示Save()方法,但如果您可以向其添加此类代码,则会收到包含您要查找的所有详细信息的exception

 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 nesting // the current instance as InnerException raise = new InvalidOperationException(message, raise); } } throw raise; } 

我知道这个问题现在已经过时了,但我希望有人发现这个问题也很有用。

  1. 最有可能(实际上,根据您的评论判断) 错误是您的变量未通过模型validation。
  2. 查看您无法看到的错误( 不更改代码 )的另一种方法是使用QuickWatch窗口查看exception。 问题是您可以从exception工具提示打开的“查看详细信息”窗口不显示EntityValidationErrors。 如果没有catch块,您可以在QuickWatch中查看任何exception变量。 幸运的是,QuickWatch有PseudoVariables。 因此,使用“$ exception”伪变量,您可以轻松查看QuickWatch窗口中当前未处理的exception。 (请参阅下面的屏幕截图) Exception Details窗口和QuickWatch窗口,带有$ exception伪变量

虽然这是一个老post,但这种方法可以更有成效!

积分

尝试这样的事情

  try { pcontext.SaveChanges(); } catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex) { Console.WriteLine(ex.InnerException); } catch (System.Data.Entity.Core.EntityCommandCompilationException ex) { Console.WriteLine(ex.InnerException); } catch (System.Data.Entity.Core.UpdateException ex) { Console.WriteLine(ex.InnerException); } catch (System.Data.Entity.Infrastructure.DbUpdateException ex) //DbContext { Console.WriteLine(ex.InnerException); } catch (Exception ex) { Console.WriteLine(ex.InnerException); throw; }