2

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() メソッドを追加した後、すべてが魅力的に機能しました。

4

1 に答える 1

3

他の人があなたと同じ問題を抱えているようです。これらのリンクを見てください: C#コードは、ステップスルーで期待される結果しか得られませんか? コードはデバッガーでステップ実行する場合にのみ正しく実行されますか?

そのため、Random クラスを複数回インスタンス化すると、奇妙な結果が得られます。

編集:

コードから、例外を消費しているように見えます。try-catch をコメントアウトして、デバッグせずに実行して、例外がスローされるかどうかを確認できますか?

于 2013-02-17T01:39:16.793 に答える