【发布时间】:2011-02-19 19:48:01
【问题描述】:
我需要在运行更新之前重置特定表中的布尔字段。 该表可能有 100 万条左右的记录,我不希望在更新前进行选择,因为它需要太多时间。
基本上我在代码中需要的是在 TSQL 中生成以下内容
update tablename
set flag = false
where flag = true
我有一些接近我需要的东西http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx 但尚未实施,但想知道是否有更标准的方法。
为了保持我们对该项目的限制,我们不能使用 SPROC 或直接在上下文中的 ExecuteStoreCommand 参数中编写 TSQL,我相信你可以做到。
我知道我需要做的事情可能不会在 EF4 中得到直接支持,我们可能需要查看 SPROC 来完成这项工作 [完全没有任何其他方式],但我只需要充分探索所有先说可能性。 在 EF 理想世界中,可以调用上面的更新标志,或者可以仅获取具有 id 和布尔标志的实体减去关联的实体并循环遍历实体并设置标志并执行单个SaveChanges 调用,但这可能不是它的工作方式。
任何想法,
提前致谢。 利亚姆
【问题讨论】:
-
“因为它花费了太多时间” - 多长时间?
-
1-2 分钟,即使是 30k 行的测试数据。我正在更新的实体有 4 个相关表,因此加载这些数据可能会产生影响。我想我想要实现的理想性能是直接在数据库上运行更新会给出什么 - 虽然不确定它是否可能
-
只需要更新一张桌子吗?
-
当它是一个完美的解决方案时却不能使用 sprocs 是不幸的——为什么要制定这条规则?
-
这是应用程序的一个强有力的指导方针,我们正在努力确保业务规则完全保留在我们的业务层中,并且它们不会在整个生命周期内缓慢迁移到 DB 层应用程序,因为不同的开发人员在应用程序上工作。我们认为这种方法也将有助于应用程序的可测试性。此外,如果没有替代方案,我们将不得不考虑针对此类情况的 SPROC,但希望在这样做之前充分探索 EF 中的替代方案。感谢您的评论。
标签: c# sql sql-server entity-framework-4