Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 248 Vote(s) - 3.57 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Validation Error on SaveChanges()

#1
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
Reply

#2
I know the question is old now, but I hope someone finds this useful, too.

1. Most likely (and indeed, judging by your comments) the **error was that your variable doesn't pass Model validation.**
2. The other way to see the errors you couldn't see (**without changing the code**) is to look at the exception using the QuickWatch window. The problem is that 'View Details' window that you can open from exception tooltip doesn't show EntityValidationErrors. And without a catch block you don't have any exception variable you can look at in QuickWatch. Luckily, QuickWatch has PseudoVariables.
**So, using "$exception" pseudovariable you can easily take a look at the current unhandled exception in QuickWatch window.** (Please, see screenshots below)
[Exception Details window][1] and
[QuickWatch window with $exception pseudovariable][2]


[1]:

[2]:
Reply

#3
Although this is an old post but this approach can be more fruitful!

[Credits][1]

Try something like this

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


[1]:

[To see links please register here]

Reply

#4
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
{
this.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;
}
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through