传递给控制器​​的数据未保存在数据库中

时间:2017-07-31 18:32:26

标签: c# asp.net-mvc entity-framework

我有一个“创建”ActionResult,它正在从视图中传回数据,但数据没有保存到数据库中。我知道数据正确地传递给控制器​​,因为我已经使用调试器完成了整个过程,但是当POST操作完成时,数据不会被保存。创建“项目”,但不保存用户(公共虚拟,因此它实际存储在名为ApplicationUserProjects的表中)字段。在代码运行时填充该字段,但是一旦操作完成,数据就不会添加到该表中,据我所知,它已完全消失。这是Controller的代码:

 bq query --format=csv "SELECT 1 x" | awk 'NR>2'

foreach循环中注释掉的代码代表了我为解决这个问题所做的不同努力,没有成功。

这是控制器使用的辅助方法:

[HttpPost]
    [ValidateAntiForgeryToken]
    [Authorize(Roles = "Administrator, Project Manager, SuperUser")]
    public ActionResult Create([Bind(Include = "Id,Name")] Project project, List<string> Developers, List<string> ProjectManagers)
    {
        if (ModelState.IsValid)
        {
            db.Projects.Add(project);
            db.SaveChanges();
            var projectsHelper = new ProjectsHelper();
            foreach (var user in Developers)
            {
                projectsHelper.AssignUserToProject(user, project);
                //project.Users.Add(db.Users.FirstOrDefault(u => u.Id == user));
                //db.SaveChanges();
            }
            foreach (var user in ProjectManagers)
            {
                projectsHelper.AssignUserToProject(user, project);
                //project.Users.Add(db.Users.FirstOrDefault(u => u.Id == user));
                //db.SaveChanges();
            }


            return RedirectToAction("Index");
        }

        return View(project);
    }

我不知道它是否重要,但这里是查看处理这些输入字段的部分:

public bool AssignUserToProject(string userId, Project project)
        {
            if (!IsUserAssignedToProject(userId, project))
            {
                project.Users.Add(db.Users.FirstOrDefault(u => u.Id == userId));
                //project.Users.Add(user);

            }

            if (IsUserAssignedToProject(userId, project))
            {
                db.SaveChanges();
                return true;
            }
            else
            {
                return false;
            }
        }

提前谢谢!

编辑: 如果我移动db.SaveChanges();在foreach块下面的任何地方行,当到达该行时,我收到此错误:“EntityFramework.dll中发生类型'System.InvalidOperationException'的异常但未在用户代码中处理{”两个对象之间的关系不能是定义因为它们附加到不同的ObjectContext对象。“}”

3 个答案:

答案 0 :(得分:0)

对我来说,代码中的条件是错误的。它必须是这样的:

public bool AssignUserToProject(string userId, Project project)
{
    if (!IsUserAssignedToProject(userId, project))
    {
        project.Users.Add(db.Users.FirstOrDefault(u => u.Id == userId));
        db.SaveChanges();
        return false;
    }

    return true;            
}

添加实体后,您必须调用SaveChanges才能真正将数据保存在数据库中。

答案 1 :(得分:0)

AssignUserToProject功能中更改行

project.Users.Add(db.Users.FirstOrDefault(u => u.Id == userId));

project.Users.Add(db.Users.FirstOrDefault(u => u.Id.Equals(userId)));

比较数据库中的字符串。

这假定u.Id字段也是一个字符串。否则,您需要在等于比较之前将字段解析为适当的数据类型。

修改

同时检查IsUserAssignedToProject中的任何相等操作,以确保它正确比较该函数内任何LINQ查询中的用户ID。

答案 2 :(得分:0)

除了&#34; db.Projects.Add(project)&#34;该问题与在控制器类和辅助类中具有不同的上下文有关。在错误的地方保存所有数据。这是控制器中实际工作的代码的清理版本。不需要使用辅助方法,所以现在情况更加整洁。

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Administrator, Project Manager, SuperUser")]
public ActionResult Create([Bind(Include = "Id,Name")] Project project, List<string> Developers, List<string> ProjectManagers)
{
    if (ModelState.IsValid)
    {
        foreach (var user in Developers)
        {
            project.Users.Add(db.Users.FirstOrDefault(u => u.Id == user));
        }
        foreach (var user in ProjectManagers)
        {
            project.Users.Add(db.Users.FirstOrDefault(u => u.Id == user));
        }
    }
    db.Projects.Add(project);
    db.SaveChanges();
    return RedirectToAction("Index");

}