これが状況です。私には3つのエンティティがあり、そのうち次の関係があります。
-Team one-to-one TeamContact
-TeamContact one-to-one TeamAddress
これらのオブジェクトを問題なく作成、追加、保存することができました。ただし、編集メソッドを作成しようとすると、変更後に親オブジェクトのみが保存されます。私がこれまでに持っているものを以下に見てください。
Dbクラスにメソッドを保存します
public void SaveTeam(Team team)
{
if (team.Id == 0)
{
context.Teams.Add(team);
}
else
{
var model = context.Teams.Find(team.Id);
context.Entry(model).CurrentValues.SetValues(team);
}
context.SaveChanges();
}
編集方法
[HttpGet]
public ActionResult Edit(int id)
{
var model = _dataSource.Teams.FirstOrDefault(t => t.Id == id);
return View(model);
}
[HttpPost]
public ActionResult Edit(Team team)
{
if (ModelState.IsValid)
{
_dataSource.SaveTeam(team);
return RedirectToAction("Detail", "Team", new { id = team.Id });
}
return View(team);
}
上で言ったように、私が持っているのは親オブジェクトを変更することしかできませんが、ここで何を見逃しましたか?
試してみました
public void SaveTeam(Team team)
{
if (team.Id == 0)
{
context.Teams.Add(team);
}
else
{
//var model = context.Teams.Find(team.Id);
var model = context.Teams.Include(c => c.TeamContact).Single(t => t.Id == team.Id);
context.Entry(model).CurrentValues.SetValues(team);
model.TeamContact = team.TeamContact;
}
context.SaveChanges();
}
上記を試した後、このエラーが発生しました:
Violation of PRIMARY KEY constraint 'PK_dbo.TeamAddresses'. Cannot insert duplicate key in object 'dbo.TeamAddresses'. The duplicate key value is (5).
The statement has been terminated.
結論として、Nレベルのディープオブジェクトをどのように更新しますか?