1

我们正在提取一个巨大的记录数据集(成百上千个),然后需要更新每个字段上的一个字段,在原子转换中一次一个。它们的记录彼此无关,我们不想对所有几十万进行盲目更新(此表上的视图和索引使这非常令人望而却步)。我可以在不进行大量转换的情况下使其工作的唯一方法如下(容器是对自定义 ObjectContext 的引用):

var expiredWorkflows = from iw in container.InitiatedWorkflows
where iw.InitiationStatusID != 1 && iw.ExpirationDate < DateTime.Now
select iw.ID;

foreach (int expiredWorkflow in expiredWorkflows)
container.ExecuteStoreCommand("UPDATE dbo.InitiatedWorkflow SET InitiationStatusID = 7 WHERE ID = @ID", new SqlParameter() { ParameterName = "@ID", Value = expiredWorkflow.ToString() } );

我们尝试循环遍历每一个,并通过容器更新字段,然后调用 SaveChanges(),但这会将所有内容作为一个事务运行。我们尝试在 foreach 循环中调用 SaveChanges(),但这会引发事务异常。有什么办法可以使用 ObjectContext 来做,所以它会做类似的事情(上面的选择将被更改为返回完整的对象,而不仅仅是 ID):

foreach (var expiredWorkflow in expiredWorkflows)
expiredWorkflow.InitiationStatusID = 7

container.SaveChanges(SaveOptions.OneAtATime);
4

1 回答 1

0

一般来说,如果您需要执行的操作与上面代码所建议的那种 UPDATE 一样简单,那么这种操作将在后端数据库上运行得更好——当然,假设有一些明确的仅选择需要更改的行的方法。实体框架更多地用于操作可以轻松加载到内存中并在那里旋转的中小型对象集,而不是存储过程通常最好的大型批量处理操作。EF 当然可以执行这些大操作,但是每行执行一条 SQL 语句需要更长的时间。

于 2012-07-25T13:08:57.467 回答