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