我有一个“创建”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对象。“}”
答案 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");
}