【发布时间】:2014-08-21 07:27:54
【问题描述】:
我是 Entity Framework 的新手,所以如果我的逻辑有偏差,请原谅我/这已经是工作的方式,但我正在开发一个应用程序,其中:
- 我将父信息存储在一个表中,主键 =
ParentId - 对于每个
ParentId,我将数千条记录存储在一个子表中,在 ParentId 上具有一对多外键关系。
因此,如果父母的信息发生变化(这种情况经常发生),我想做的是让我的程序执行相当于:
DELETE FROM ChildTable WHERE ParentId = 'xx'
在使用相同 ParentId 的新/更新值更新子表之前。
据我所见,我会这样做:
- 使用
ctx.Database.ExecuteSqlCommand()kind-of-concept 输入实际的 SQL 命令 - 在某种程度上,实际上循环遍历子元素并将它们设置为在更新数据库上下文之前删除(这似乎效率非常低,因为我猜它必须将它们从数据库中拉出才能这样做,我想做的就是将它们全部删除)。
在 EF 中以最有效的方式执行此操作的正确方法是什么?
【问题讨论】:
-
@Stilgar,感谢您指出这一点,我确实看到了这个问题,但我仍然感到困惑(也许我需要更多的解释)这是否需要循环遍历所有子元素或不......那部分对我来说仍然没有意义......
-
如果您担心效率,只需编写存储过程或原始 SQL。 EF 对此有很好的支持。
-
根据您的陈述我是全新的通常用于此的术语是批量删除。但你不会知道,直到你知道这一点。考虑到这一点,您可能会找到更好的结果,但可以节省一些时间。这是一个很好的 SO stackoverflow.com/questions/869209/… 。为了节省您更多的时间,这里有一个不错的库,它为您构建了许多功能。它也有关于如何使用它的很好的文档。它使用 Linq 仅供参考。 github.com/loresoft/EntityFramework.Extended
-
关于最有效的方式也是您的观点,这是您可能感兴趣的扩展库的引用“实体框架的当前限制是为了更新或删除一个实体,您必须先将其检索到内存中。现在在大多数情况下,这很好。但是,在某些情况下,性能会受到影响。此外,对于单次删除,必须先检索对象,然后才能将其删除,这需要两个调用数据库。批量更新和删除消除了在修改实体之前检索和加载实体的需要。"
标签: c# .net vb.net entity-framework