SaveChanges - 在数据库中创建新对象(错误)

SaveChanges - Creating new object in database (error)

我在 Visual Studio 2013 年有一个 MVC4 项目,它目前是一个虚构的私人航班公司的非常基本的网站。

这是我的相关文件: https://gist.github.com/anonymous/b744c44dc77084839e6d

我正在尝试为管理员实现一个表单/视图来编辑现有的用户数据库。我已成功制作表格,但在尝试保存到数据库时出现错误。

编辑:数据库:http://gyazo.com/ff5d077b7f000ee78e372530b237696b

(这是现有数据库的样子: http://gyazo.com/a088c2cd75779b39bb343eca1aecb219

这就是 AdminIndex pov 的样子:http://gyazo.com/3a3533d07a96b4116554e0795df81a52)

MyTemplateController(基本上是我的 HomeController)中,我有一段代码负责创建新的 'person'(如果您愿意的话)。

    [HttpPost]
    public ActionResult Create(SystemUser users)
    {
        if (ModelState.IsValid)
        {
            //ss.StudentsTbls.AddObject(student); // Ignore this
            ss.SystemUsers.Add(users);
            ss.SaveChanges();
            return RedirectToAction("AdminIndex");
        }

        return View(users);
    }

此代码旨在保存用户从 AdminIndex -> Create New 插入的信息,但是,当我按创建时,出现以下错误:http://gyazo.com/fe45ace191af8a6944f39217adb576a5

谁能指出为什么会这样?谢谢。

编辑:AdminIndex.cshtml 和 Create.cshtml https://gist.github.com/anonymous/fbd92ef0b1847efd2408

在 try catch 块中编写代码

 [HttpPost]
    public ActionResult Create(SystemUser users)
    {
        try
        {
            if (ModelState.IsValid)
            {
                //ss.StudentsTbls.AddObject(student); // Ignore this
                ss.SystemUsers.Add(users);
                ss.SaveChanges();
                return RedirectToAction("AdminIndex");
            }        
        }
        catch (Exception exception)
        {
        }

        return View(users);
    }   

现在,如果您将鼠标悬停在异常上或将其添加到 Watch,然后导航到异常详细信息,您将看到导致错误的特定列通常发生在 table-约束条件下被破坏了..

如果您不知道 EntityValidationErrors 在内部是如何工作的,那么使用它会很棘手。

您要捕获的实际异常是 DbEntityValidationException

这个异常有一个属性EntityValidationErrors,这是一个IEnumerable<DbEntityValidationResult>.

这个DbEntityValidationResult然后有一个属性ValidationErrors,这是一个IEnumerable<DbValidationError>.

最后,DbValidationError有一个属性ErrorMessage,这才是真正的肉所在。

将您的代码包装在 try/catch 块中并获得这些实际验证错误如下所示:

try
{
    if (ModelState.IsValid)
    {
        ss.SystemUsers.Add(users);
        ss.SaveChanges();
        return RedirectToAction("AdminIndex");
    }
    return View(users);

}
catch (DbEntityValidationException ex)
{
    var errorMessages = ex.EntityValidationErrors
            .SelectMany(e => e.ValidationErrors)
            .Select(e => e.ErrorMessage)
            .ToList();
    // Here you can see the actual validation errors when you're debugging
}

当然,您首先遇到此异常意味着您控制器上的验证规则与您的数据库约束不匹配。

这是个人喜好问题,但我通常不喜欢让我的 DAL 捕获验证错误。如果您的 BLL 的验证规则中存在任何错误,这应该只是您最后的手段。你应该这样对待它们:确保下次当你在 DAL 中看到这些问题发生时,它们会被你的控制器(或应用程序/业务层)捕获。