EF Core:断开连接的环境中的子集合更改检测

EF Core: Child collection change detection in a disconnected environment

提问人:Pavel 提问时间:11/11/2023 更新时间:11/11/2023 访问量:24

问:

我的后端是一个 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();
}
C# ASP.NET-Web-API 实体框架核心

评论


答: 暂无答案