In my ASP.NET MVC 3 application, I use EF 4.2. In my database, I have a unique constraint for a column.
I try to insert same data in order to see what I get but I am getting the below error:
An error occurred while updating the entries. See the inner exception
for details.
Inside the inner exception I can see the full error about unique constraint. But how can I uniquely catch this exception to tell the user this:
You are entering the same value again.
Here is what I do currently:
try
{
UpdateModel<ConditionType>(conditionType, null, null, new string[] { "ConditionTypeId" });
_conditionTypeRepository.Save();
return RedirectToAction("conditiontype");
}
catch (Exception ex)
{
ModelState.AddModelError("", "There was an error while updating: " + ex.Message);
}
But this is a generic approach. What I would like to do is to provide a specific message.
Any thoughts?
Edit:
I tired the below but this time it didn't catch it:
catch (SqlException ex)
{
if (ex.Number == 2627)
{
ModelState.AddModelError("", "You are entering the same value again.");
}
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
}
I dug into a little bit and it turned out that it throws an exception type of System.Data.Entity.Infrastructure.DbUpdateException
which does not contain the exception number.
EDIT:
Here how I solve the problem but I am sure it is not the best way of solving it. Any idea how to refactor this code?
catch (Exception ex) {
if (ex.InnerException.InnerException.GetType() == typeof(SqlException)) {
if (((SqlException)ex.InnerException.InnerException).Number == 2627)
ModelState.AddModelError("", "You are entering the same value again.");
else
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
} else {
ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…