Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validation Error on SaveChanges()

I have the following Action method inside my Asp.net mvc web application:-

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

which calls the following method:-

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

My model class is as follow:-

public partial class TMSStorageDevice {     public int TMSStorageDeviceID { get; set; }     public string Name { get; set; }     public Nullable<decimal> 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; } } 

but if i call the Create action method i will get the following 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: 

Can anyone advice what is wrong, as i double check my code and every thing should work fine ? Thanks

like image 892
john Gu Avatar asked Oct 22 '13 13:10

john Gu


People also ask

What does the Dbcontext SaveChanges () method return?

Returns. The number of state entries written to the underlying database. This can include state entries for entities and/or relationships.

How do you fix validation failed for one or more entities see EntityValidationErrors property for more details?

Error: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. solution: correct your Data Model according to your database SET fieldNames or length.

What is entity validation error?

EntityValidationErrors is a collection which represents the entities which couldn't be validated successfully, and the inner collection ValidationErrors per entity is a list of errors on property level. These validation messages are usually helpful enough to find the source of the problem.


1 Answers

You haven't shown the Save() method but if you can add code like this to it you'll get an exception that contains all the details you're looking for

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; } 
like image 65
qujck Avatar answered Oct 09 '22 05:10

qujck