实体框架 - 按 id 删除相关记录
本文关键字:记录 删除 id 框架 实体 | 更新日期: 2023-09-27 18:18:15
好的。 假设我有结构:
学校可以有很多学生,学校 -> 学生 -> 学生家长 <- 家长 ->地址
学生可以是亲戚,有同一组父母(可以对多(。每个家长可以有多个地址。
假设父母人数相同的学生不能在不同的学校学习。
如果给定school_Id = 5,我想删除这所学校和所有相关记录。如何在实体框架 4 中轻松执行此操作?
您的问题的答案与此问题相同。
您正在尝试在错误的层中解决问题。你需要 重新考虑您的数据库设计,特别是如何维护 参照完整性。
您需要设置外键的"级联删除"并反映 在您的实体模型中。然后数据库将做出必要的 删除引用时为维护参照完整性而进行的更改 实体。
实体框架无法从数据库中未实例化为内存对象的数据中删除数据。这意味着您需要加载学校数据、所有学生数据、所有学生家长数据等,然后您需要手动删除所有数据。
这似乎有很多工作要做,因此您可能想采取另一种方法来解决此问题 - 使用映射到ObjectContext
的数据库上的存储过程删除所有这些数据,这将执行得更好,因为您不需要将所有数据放入内存。
但这似乎也很麻烦。最好的方法是在数据库上创建Cascade delete
约束,并将其也映射到实体框架的模型中。这有两个优点 - 您只需要加载学校数据,并且在从模型中删除数据后,它将从数据库中删除,级联删除将删除所有引用数据。但是,如果内存中已有学校和学生数据,EF
将负责将内存中的这些对象标记为已删除,这将使您的数据与数据库状态保持一致。
此问题的最佳解决方案取决于您是否可以修改数据库。如果可以的话 - 去cascade delete
.如果你不能 - 我会推荐stored procedure
方法表现更好(假设性能是一个问题,并且数据库中有很多学生、家长等(。