我正在使用 Blazor WASM 托管解决方案运行 Entity Framework Core。我有一个如下所示的模型:
public class Parent
{
public int ParentID { get; set; }
public List<Child> Children { get; set; }
}
客户端 Blazor 正在通过 API 调用获取父对象,正在修改列表以从其列表中添加/删除项目,然后被发送回 API 进行更新/保存。
public async Task UpdateAsync(int id, Parent Parent)
{
try
{
if (!await ExistsAsync(id))
return;
_dataContext.Entry(Parent).State = EntityState.Modified;
await _dataContext.SaveChangesAsync();
}
catch (Exception ex)
{
_logger.LogError(ex, "Error in UpdateAsync()");
throw;
}
}
上面的代码不会更新 Child 的集合,因此下次调用 Get 时,就像更新之前一样。在做了一些研究之后,我可以看到如果对象通过 API 被序列化和反序列化,EF 无法跟踪更改。我尝试了以下
public async Task UpdateAsync(int id, Parent Parent)
{
try
{
if (!await ExistsAsync(id))
return;
//_dataContext.Entry(Parent).State = EntityState.Modified;
_dataContext.Parents.Update(Parent);
await _dataContext.SaveChangesAsync();
}
catch (Exception ex)
{
_logger.LogError(ex, "Error in UpdateAsync()");
throw;
}
}
通过此更改,我可以向集合中添加新项目并正确保存,但是从集合中删除项目不起作用。
我找到了这个手动跟踪子属性添加和删除的答案,但这已经是 6 年前的事情了。我希望 EF 从那时起就发生了变化,可能会支持这一点。
How to add/update child entities when updating a parent entity in EF