断开与EF Core嵌套集合的关联。
断开与EF Core嵌套集合的关联。
我的Blazor应用程序使用Web API获取数据。我使用EF Core通过通用存储库访问数据。我的实体具有父子关系,其中子实体嵌套在父实体的集合中。我的代码如下所示:
public class Parent { [Required] public long Id { get; set; } [Required] public string Name { get; set; } public virtual ICollectionChildren { 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中设置某些选项来支持的。
非常感谢任何帮助。