Ошибка проверки SaveChanges()
В моем веб-приложении Asp.net mvc есть следующий метод действий: -
[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<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; }
}
но если я вызову метод Create action, я получу следующее исключение: -
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:
Может ли кто-нибудь советовать, что не так, поскольку я дважды проверяю свой код, и каждая вещь должна работать нормально?
Благодаря
Ответы
Ответ 1
Вы не показали метод Save()
, но если вы можете добавить к нему такой код, вы получите исключение, содержащее все детали, которые вы ищете
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;
}
Ответ 2
Я знаю, что сейчас вопрос старый, но я надеюсь, что кто-то тоже найдет это полезным.
- Скорее всего (и, судя по вашим комментариям), ошибка заключалась в том, что ваша переменная не проходит проверку модели.
- Другой способ увидеть ошибки, которые вы не могли увидеть (без изменения кода), - это посмотреть на исключение, используя окно QuickWatch. Проблема в том, что окно "Просмотр деталей", которое вы можете открыть из всплывающей подсказки, не показывает EntityValidationErrors. И без блока catch у вас нет переменной исключения, которую вы можете посмотреть в QuickWatch. К счастью, QuickWatch имеет PseudoVariables.
Итак, используя псевдовыражение "$ exception", вы можете легко взглянуть на текущее необработанное исключение в окне QuickWatch. (см. скриншоты ниже)
Окно сведений об исключении и
Окно QuickWatch с псевдонимом $exception
Ответ 3
Хотя это старый пост, но этот подход может быть более плодотворным!
Кредиты
Попробуйте что-то вроде этого
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;
}