我有一个使用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并在不进行调试的情况下运行它,看看它是否引发任何异常?

07-24 19:20
查看更多