【问题标题】:Why does my ASP.NET MVC 3 with EF application only work when I step through it while debugging?为什么我的带有 EF 应用程序的 ASP.NET MVC 3 仅在我在调试时单步执行时才有效?
【发布时间】: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


【解决方案1】:

看起来其他人也遇到了和你一样的问题。看看这些链接:C# code only gives expected results on step through?, Code runs correctly only when stepping through it with debugger?

所以,如果你不止一次实例化 Random 类,你会得到一些奇怪的结果。

编辑:

从您的代码看来,您正在使用异常。你可以注释掉 try-catch 并在不调试的情况下运行它,看看它是否抛出任何异常?

【讨论】:

  • 我使用了两个 Random 实例并将其替换为一个,但我仍然遇到同样的问题。
  • 只有一次。然后我将它传递给具有 ref Random 名称的其他方法。
  • 您能否尝试不使用 Random 并创建一个虚拟对象以查看它是否可以在不单步执行的情况下工作?这将帮助您确定 Random 对象肯定存在问题
  • 好主意。好的,我这样做了,但我仍然遇到同样的问题。
  • 从您的代码看来,您正在使用异常。你可以注释掉 try-catch 并在不调试的情况下运行它,看看它是否抛出任何异常?
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2010-12-01
  • 2011-07-20
  • 2022-01-27
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多