提问人:Pavel 提问时间:11/11/2023 更新时间:11/11/2023 访问量:24
EF Core:断开连接的环境中的子集合更改检测
EF Core: Child collection change detection in a disconnected environment
问:
我的后端是一个 Web API,前端是一个 Angular 应用程序。
我们的前端允许用户在对 API 的单个 HTTP POST 调用中编辑 Parent 对象上的多个字段以及子集合。
这很重要,因为用户可以从集合中删除多个项,然后将新项添加到集合中,所有这些都是在对 API 的同一 HTTP POST 调用期间完成的。
调用 API 以更新 Parent 对象时,会发送更新的项集合。
示例:
前端接收集合 { 1, 2, 3, 4, 5 }
用户删除项目 1、2。
用户添加项目 6。
用户单击“保存”并发送包含以下集合的 POST:{ 3, 4, 5, 6 }
问题:
EF Core 中是否有内置功能,允许它检测集合中缺少哪些项以及哪些项是集合中的新项,以便它可以适当地保存更改?
public class Parent
{
[Required]
public long Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
[Required]
public long Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public long ParentId { get; set; }
public Parent Parent { get; set; }
}
// Repository - generic update method
public virtual async Task<TEntity> UpdateAsync(TEntity entity)
{
if (entity == null)
{
throw new ArgumentNullException($"{nameof(AddAsync)} entity must not be null");
}
try
{
// HERE EF Core needs to identify be able to detect parent.Children collection changes. Which are new, which are dirty, which are marked for deletion.
await DbContext.SaveChangesAsync();
return entity;
}
catch (Exception ex)
{
throw new Exception($"{nameof(entity)} could not be updated: {ex.Message}");
}
}
// Controller - update for Parent
[HttpPut("{id}")]
public async Task<IActionResult> PutParent(long id, ParentDto dto)
{
if (id != parent.Id)
{
return BadRequest();
}
try
{
var parentEntity = mapper.Map<Parent>(dto);
await Repository.UpdateAsync(parentEntity);
}
catch (DbUpdateConcurrencyException)
{
if (!ParentExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
答: 暂无答案
评论