SaveChanges()上的验证错误

joh*_* Gu 23 c# asp.net asp.net-mvc entity-framework

我的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);
}
Run Code Online (Sandbox Code Playgroud)

它调用以下方法: -

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的模特课如下: -

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; }
}
Run Code Online (Sandbox Code Playgroud)

但如果我调用Create动作方法,我将得到以下异常: -

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:
Run Code Online (Sandbox Code Playgroud)

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

quj*_*jck 113

您尚未显示该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;
}
Run Code Online (Sandbox Code Playgroud)

  • @johnG - 这是Entity Framework的一个功能!;-) (7认同)
  • 多谢兄弟。今天为我节省了很多时间。没有你的回答不会很容易 (2认同)

小智 6

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

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