gpt4 book ai didi

c# - EF4 在不进行选择的情况下更新表中所有行的值

转载 作者:太空狗 更新时间:2023-10-30 01:26:23 25 4
gpt4 key购买 nike

在运行更新之前,我需要重置特定表中的 bool 字段。该表可能有 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 和 bool 标志的实体,只减去关联的实体并循环遍历实体并设置标志并执行单个SaveChanges 调用,但这可能不是它的工作方式。

任何想法,

提前致谢。利亚姆

最佳答案

我会去找那些引入了不直接使用 SQL 或 SProc 的限制的利益相关者,并向他展示这些事实:

  • ORM 中的更新(如 Entity Framework )以这种方式工作:加载对象,执行修改,保存对象。这是唯一有效的方法。
  • 很明显,在您的情况下,这意味着加载 1M 实体并分别执行 1M 更新(EF 没有命令批处理 - 每个命令都在其自己的数据库往返中运行) - 通常是绝对无用的解决方案。
  • 您提供的示例看起来非常有趣,但它是针对 Linq-To-Sql 的。不适用于 Entity Framework 。除非您实现它,否则您无法确定它是否适用于 EF,因为 EF 中的基础结构要复杂得多。因此,您可以花费几个工作日来执行此操作而没有任何结果 - 这应该得到利益相关者的批准。
  • 使用 SProc 或直接 SQL 的解决方案将花费您几分钟时间,而且它会很简单。
  • 在这两种解决方案中,您都必须处理另一个问题。如果您已经有具体化的实体并且您将运行此类命令(通过提到的扩展或通过 SQL),这些更改将不会反射(reflect)在已加载的实体中 - 您将必须迭代它们并设置标志。
  • 这两种情况都破坏了工作单元,因为一些数据更改是在工作单元完成之前执行的。

关键在于针对正确的需求使用正确的工具。

顺便说一句。可以避免加载相关表。这只是关于您运行的查询。不要使用 Include 并且不要访问导航属性(在延迟加载的情况下),您将不会加载关系。

可以仅选择 Id(通过投影),创建虚拟实体(仅将 id 和 flag 设置为 true)并仅执行 flag 的更新,但它仍将执行多达 1M 的更新。

using(var myContext = new MyContext(connectionString))
{
var query = from o in myContext.MyEntities
where o.Flag == false
select o.Id;
foreach (var id in query)
{
var entity = new MyEntity
{
Id = id,
Flag = true
};
myContext.Attach(entity);
myContext.ObjectStateManager.GetObjectStateEntry(entity).SetModifiedProperty("Flag");
}

myContext.SaveChanges();
}

此外,它只能在空对象上下文中工作(或者至少不能将更新表中的实体附加到上下文中)。因此,在某些情况下,在其他更新之前运行它需要两个 ObjectContext 实例 = 手动共享 DbConnection 或两个数据库连接,在事务的情况下 = 分布式事务和另一个性能影响。

关于c# - EF4 在不进行选择的情况下更新表中所有行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com