为什么我的ASP.NET MVC 3与EF应用程序只有当我在调试时逐步通过它时才能工作

本文关键字:调试 工作 MVC NET ASP 我的 应用程序 EF 为什么 | 更新日期: 2023-09-27 17:59:47

我有一个控制器,它使用实体框架更新数据库中的值。不幸的是,当我运行应用程序时,它似乎根本不起作用。当我在代码的特定部分设置断点并逐步执行时,它可以完美地工作。

这是我的控制器代码:

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();
        }
    }

我有一种感觉,这是我将新团队分配给现有上下文的方式,但从我读过的所有教程来看,这是他们这样做的方式,至少对于字符串值是这样。有人知道我为什么会有这种奇怪的行为吗?

*更新*已解决

我解决了我的问题。我的直觉是对的,我只需要增加团队。玩家。在将新玩家组分配给现有团队之前清除()。

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()方法之后,一切都像一个符咒。

为什么我的ASP.NET MVC 3与EF应用程序只有当我在调试时逐步通过它时才能工作

看起来其他人也遇到过和你一样的问题。看看这些链接:C#代码只给出了步骤通过的预期结果?,代码只有在使用调试器逐步执行时才能正确运行?

因此,如果您多次实例化Random类,您将得到一些奇怪的结果。

编辑:

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