断开与EF Core嵌套集合的关联。

22 浏览
0 Comments

断开与EF Core嵌套集合的关联。

我的Blazor应用程序使用Web API获取数据。我使用EF Core通过通用存储库访问数据。我的实体具有父子关系,其中子实体嵌套在父实体的集合中。我的代码如下所示:

public class Parent
{
    [Required]
    public long Id { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection 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; }
}
// 存储库 - 通用更新方法
public virtual async Task UpdateAsync(TEntity entity)
{
    if (entity == null)
    {
        throw new ArgumentNullException($"{nameof(AddAsync)} entity must not be null");
    }
    try
    {
        DbContext.Update(entity);
        await DbContext.SaveChangesAsync();
        return entity;
    }
    catch (Exception ex)
    {
        throw new Exception($"{nameof(entity)} could not be updated: {ex.Message}");
    }
}
// 控制器 - 更新 Parent
[HttpPut("{id}")]
public async Task PutParent(long id, Parent parent)
{
    if (id != parent.Id)
    {
        return BadRequest();
    }
    try
    {
        await Repository.UpdateAsync(parent);
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ParentExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return NoContent();
}

我的问题是当我从Children集合中删除项目时。我期望它们被删除,但由于更新是断开的,EF Core显然无法识别此操作并且不会删除它们。

我找到了一些使我的应用程序按预期工作的方法,但它们都是我称之为“变通方法”的方法。

其中之一是添加一个处理更新方式不同的特定实体存储库,从数据库中查找缺失的行,然后标记它们以进行删除(参见Entity Framework Core,删除嵌套集合中的项目

虽然这个解决方案对我有效,但我希望找到一些解决方案,可以在基本水平上支持我的应用程序的这种行为,而无需通过每个实体的特定类型存储库来支持它。

我看到有人建议使用一些“聪明的孤立处理”(如EF是否可以自动删除未删除父项的孤立数据?),但是我无法为我的情况在EF Core中找到相应的解决方案。另一个建议是使用标识关系,例如EF是否可以自动删除未删除父项的孤立数据?,但是我也无法使这个建议生效。

我认为我一定做错了什么,因为这个预期的行为应该是通过在我的DbContext中设置某些选项来支持的。

非常感谢任何帮助。

0