Entity Frameworkコアを使用して簡単なwebapiを構築する。私はモデルとビューモデルを使ってクライアントが実際に受け取っているデータを管理しています。ここに私が作成したモデルとのviewmodelsです:Entity Frameworkコアで関連するデータを更新する
public class Team : BaseEntity
{
[Key]
public int TeamId { get; set; }
[Required]
public string TeamName { get; set; }
public List<TeamAgent> TeamAgents { get; set; }
}
public class TeamViewModel
{
[Required]
public int TeamId { get; set; }
[Required]
public string TeamName { get; set; }
[DataType(DataType.Date)]
public DateTime DateCreated { get; set; }
[DataType(DataType.Date)]
public DateTime DateModified { get; set; }
public List<TeamAgent> TeamAgents { get; set; }
}
public class TeamAgent : BaseEntity
{
[Key]
public int TeamAgentId { get; set; }
[ForeignKey("Agent")]
public int AgentId { get; set; }
[JsonIgnore]
public virtual Agent Agent { get; set; }
[ForeignKey("Team")]
public int TeamId { get; set; }
[JsonIgnore]
public virtual Team Team { get; set; }
[Required]
public string Token { get; set; }
}
public class TeamAgentViewModel
{
[Required]
public virtual AgentViewModel Agent { get; set; }
[Required]
public string Token { get; set; }
}
今、私は私のコントローラ内のUpdateメソッドを作成し更新するために:
[HttpPut("{id}")]
public async Task<IActionResult> Update(int id, [FromBody]TeamViewModel teamVM)
{
if (ModelState.IsValid)
{
var team = await _context.Teams
.Include(t => t.TeamAgents)
.SingleOrDefaultAsync(c => c.TeamId == id);
team.TeamName = teamVM.TeamName;
// HOW TO HANDLE IF SOME TEAMAGENTS GOT ADDED OR REMOVED???
_context.Teams.Update(team);
await _context.SaveChangesAsync();
return new NoContentResult();
}
return BadRequest(ModelState);
}
私は自分自身がチームに接続TeamAgentsを更新するためにどのような問題で捕まってしまいました。私が試して働いたことの一つは、すべてのTeamAgentを削除してから、チームのデータが更新されるたびに新しいTeamAgentを作成することでした。方法は次のとおりです:
team.TeamAgents.Clear();
await _context.SaveChangesAsync();
team.TeamAgents.AddRange(teamVM.TeamAgents);
_context.Teams.Update(team);
await _context.SaveChangesAsync();
これは明らかにそれを行うには良い方法ではありません。 Entity Frameworkコアで関連アイテムを更新する正しい方法は何ですか?
@IvanStoev、あなたのコメントを回答として追加してください。私はそれを受け入れます。 – hs2d
ありがとうございますが、これは間違いなく私が答えになりたいものではありません。うまくいけば、そのようなシナリオは、GraphDiff for EF6のようなMSやサードパーティのパッケージによって対処されることをうまく願っています。 –