【发布时间】:2013-02-01 17:56:28
【问题描述】:
我有一个控制器,它使用实体框架更新数据库中的值。不幸的是,当我运行我的应用程序时,它似乎根本不起作用。当我在代码的特定部分设置断点并单步执行时,它可以完美运行。
这是我的控制器代码:
public ActionResult ManageGame(int id, FormCollection collection, string[] selectedPlayers)
{
var gameToUpdate = db.Games
.Include("Teams")
.Where(g => g.ID == id)
.Single();
if (TryUpdateModel(gameToUpdate, "", null, new string[] { "Players" }))
{
try
{
List<Player> team1Players = generateRandomTeam();
List<Player> team2Players = generateRandomTeam();
如果我在此处设置断点并单步执行其余代码就可以了,否则不会保存任何内容。
foreach (var team in gameToUpdate.Teams)
{
if (!team1added)
{
team.Players = team1Players;
team1added = true;
}
else
{
team.Players = team2Players;
}
}
db.Entry(gameToUpdate).State = EntityState.Modified;
db.SaveChanges();
}
catch (DataException)
{
ModelState.AddModelError("", "Unable to save changes.");
}
}
try
{
return RedirectToAction("Index");
}
catch
{
return View();
}
}
我感觉这是我将新团队分配到现有上下文的方式,但从我阅读的所有教程来看,他们就是这样做的,至少对于字符串值而言。有人知道我为什么会出现这种奇怪的行为吗?
*更新*已解决
我解决了我的问题。我的预感是对的,我只需要添加 team.Players.Clear() 然后再将新的玩家组分配给现有的团队。
foreach (var team in gameToUpdate.Teams)
{
if (!team1added)
{
team.Players.Clear()
team.Players = team1Players;
team1added = true;
}
else
{
team.Players.Clear()
team.Players = team2Players;
}
}
当我没有那个时,我得到了一个主键违规异常。不幸的是,我没有看到这个异常,因为正如 DarK 所指出的那样,我的代码正在吞噬它。所以,在添加 Clear() 方法之后,一切都像魅力一样。
【问题讨论】:
-
你检查过你的连接字符串吗?
-
是的,我的连接字符串很好。就像我说的,当我在调试时单步执行它时,它会更新得很好。如果我只是运行它,不调试它是行不通的。
-
在之前尝试使用 thread.sleep(1000) 并删除你的断点。我认为你可能有时间和锁定问题。
-
Thread.Sleep 没有任何区别。
标签: c# asp.net-mvc entity-framework linq-to-entities