我有一个使用Entity Framework更新数据库中值的控制器。不幸的是,当我运行我的应用程序时,它似乎根本无法工作。当我放置断点并逐步执行代码的特定部分时,它可以完美地工作。
这是我的控制器代码:
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()方法之后,一切都像灵符一样工作。
最佳答案
看起来其他人也遇到了与您相同的问题。查看以下链接:C# code only gives expected results on step through?,Code runs correctly only when stepping through it with debugger?
因此,如果您多次实例化Random类,您将得到一些奇怪的结果。
编辑:
从您的代码看来,您正在使用异常。您能否注释掉try-catch并在不进行调试的情况下运行它,看看它是否引发任何异常?