实体框架 - 有效删除所有子实体而不加载它们

时间:2014-06-30 20:24:09

标签: c# .net vb.net entity-framework

我是Entity Framework的新手,所以请原谅我,如果我的逻辑偏差/这是事情已经发挥作用的方式,但我正在开发一个应用程序,其中:

  1. 我将父信息存储在一个主键= ParentId
  2. 的表中
  3. 对于每个ParentId,我将数千条记录存储在ParentId上具有一对多外键关系的子表中。
  4. 所以,如果父母的信息发生了变化(这种情况可能经常发生),我想做的就是让我的程序执行相当于:

    DELETE FROM ChildTable WHERE ParentId = 'xx'
    

    在使用相同ParentId的新/更新值更新子表之前。


    从我所看到的情况来看,我要做的就是:

    • 使用ctx.Database.ExecuteSqlCommand()种类的概念
    • 输入实际的SQL命令
    • 在某种程度上,实际上循环遍历子元素并在更新数据库上下文之前将它们设置为删除(这似乎效率极低,因为我猜它必须从数据库中取出它们才能做到这一点,我想做的只是删除所有。)

    以最有效的方式在EF中执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

对于简单的批量删除,我通常只是直接发出一个SQL语句。即:

context.Database
    .ExecuteSqlCommand("DELETE FROM TheTable Where MyColumn = {0}", parameter);

如果您需要更高级的支持,那么使用Ef Extended的另一个答案也适用。这只是一种简单的方法,可以进行不需要额外依赖的简单查询。

但请注意,执行此操作时,DbContext的内部缓存可能与您的数据库不同步。因此,在执行这样的命令之后,最好不要再做任何与Object相关的查询,直到你新建了一个上下文。

答案 1 :(得分:2)

批量删除和任何批量更新语句是默认实体框架行为的限制。一种解决方法是使用此扩展库来允许这些批量命令,而无需将实体拉入内存以删除它们。

https://github.com/loresoft/EntityFramework.Extended。它还有关于该网站的良好文档,以及如何使用各种功能。