【问题标题】:Removing all records from navigation properties in Entity Framework从实体框架中的导航属性中删除所有记录
【发布时间】:2011-05-30 21:31:55
【问题描述】:

我在 EF 转换为导航属性的 Program 和 Student 表之间有 1:N 的关系。现在我想删除这个导航学生中的所有记录。 我是这样开始的:

foreach(Student student in program.Students)
program.Students.Remove(student);

但我对此有点怀疑。

比我尝试的这种方式:

while (program.Students.Count > 0)
    program.Students.Remove(program.Students.ToList()[0]);

但这似乎也很奇怪。

是否有一些更简单的方法可以做到这一点,或者如果没有,哪种方法最好?

【问题讨论】:

    标签: c# entity-framework-4


    【解决方案1】:

    除非你的程序和学生之间有一个非常特殊的关联,称为identifying relation,否则你应该使用这样的东西:

    foreach(var student in program.Students.ToList())
    {
        program.Students.Remove(student); // Break realation
        context.Students.DeleteObject(student); // Delete student
    }
    

    从导航属性中删除学生只会将学生中的 FK 设置为 null,但不会删除记录。如果 FK 不可为空,则会出现异常。

    【讨论】:

    • 那么 .Clear() 方法呢?
    • 清除方法应该仍然只会破坏关系,但不会删除学生。
    • 我刚刚在调用Clear()后检查了我的表数据,所有数据都被删除了。所以 Clear() 删除所有数据。只有当我查看表格数据时没有显示这些没有关系的数据时才会发生这种情况,对此我几乎没有怀疑。我错过了说我在 Clear() 之后调用 SaveChanges(),Ladislav,也许你在没有调用 SaveChanges() 方法的情况下考虑了这一点。
    • 您的Student 类是如何定义的?您使用的是 POCO 还是 EntityObjects?
    • 旧,但在使用 Clear()Remove() 时,我遇到外键违规。当我使用DeleteObject() 时,我没有收到任何错误。
    【解决方案2】:

    我真的不知道它是否会起作用,但我忍不住,我很好奇。 program.Students.Clear() 工作吗? 或者也许重置它,重新初始化它? 希望对你有所帮助...

    编辑:请使用@Ladislav Mrnka 的回复,因为那是正确的。 我试图删除答案,但我不能,因为它是被接受的

    【讨论】:

    • 呵呵:)。我不敢相信我错过了 Clear() :) 我正在寻找像 RemoveAll、DeleteAll 之类的东西 :)
    • 正如 Ladislav 所说,Clear() 只会使 FK 无效。如果您有一个可为空的类型,这不会引发错误,但学生记录仍然存在。如果 FK 列不可为空,那么它将在 SaveChanges() 上引发错误。我目前使用的是 EF5/6 Code-First。
    • 当我使用 Clear() 方法删除时。收到此错误:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
    • 这不是答案。使用“clear”清除导航属性集合不会删除实体,并导致 Soren 描述的错误。
    • 对 Clear 所做的所有错误答案都是删除关系
    【解决方案3】:

    .Clear() 方法非常好。它删除数据库中的所有导航属性。这很简单,而不是 foreach 循环。

    【讨论】:

    • 不幸的是 Clear 不会从数据库中删除已清除的元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多