Im使用Entity Framework Core構建簡單的webapi。我使用模型和視圖模型來管理客戶端實際接收的數據。這裏的模型和的ViewModels我創建:使用Entity Framework Core更新相關數據
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; }
}
現在更新我在控制器中創建一個更新方法:
[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 。我嘗試過的所有工作之一就是刪除所有的TeamAgents,然後在每次更新Team數據時創建新的TeamAgents。這是如何:
team.TeamAgents.Clear();
await _context.SaveChangesAsync();
team.TeamAgents.AddRange(teamVM.TeamAgents);
_context.Teams.Update(team);
await _context.SaveChangesAsync();
但這顯然不是很好的方式來做到這一點。使用Entity Framework Core更新相關項目的正確方法是什麼?
[保存數據 - 斷開實體]的EF核心的(https://docs.microsoft.com/en-us/ef/core/saving/disconnected-entities)部分仍然是空的。這意味着沒有好的(正確的)通用方法來做到這一點。 –
@IvanStoev,請添加您的評論作爲答案,我會接受它。 – hs2d
謝謝,但這絕對不是我想成爲答案的東西。希望在某些時候,這樣的場景可以通過MS或第三方軟件包如GraphDiff for EF6解決。 –