私はかなり大規模なWindowsワークフローの実装を持っており、ワークフローを更新しなければならない場合があります。時々、ワークフローの定義が壊れて、その結果、IndexOutOfRangeExceptionがスローされる状況が発生します。WFでTerminate()またはAbort()メソッドを使用してワークフローを終了できる場合、これは問題にはなりません。
私が知っている2つの解決策があります。1つ目は、Microsoftが作成した.SQLスクリプトを使用してワークフローテーブルを削除および追加することです。もう1つは、定義を変更して永続テーブルに保存することです。これは非常に面倒な作業であり、気の弱い人にはお勧めできません。
おそらく人々が検討することを恐れている3番目のオプションがあるかどうかを知りたいです-dbo.InstanceStateテーブルとdbo.WorkflowInstanceテーブルからレコードを削除します。 以下は、トリックを実行するスクリプトです。
DECLARE @WorkflowInstancID uniqueidentifier
-- SET @WorkflowInstancID = <Your friendly, offending Workflow Instance ID>
DELETE FROM dbo.WorkflowInstanceEvent
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.UserEvent
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.ActivityInstance
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.ActivityExecutionStatusEvent
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.InstanceState WHERE uidInstanceID = @WorkflowInstancID
DELETE FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID
GO
この単純なスクリプトは私の場合は機能します。このアプローチの賛否両論を聞くために、コミュニティにそれを提示したかっただけです。