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