在1.8,1.9等版本,每當打開Workflow Editor,存檔時會將Workflow Activity Record的記錄刪除,再重新建立新的記錄,導致目前在正執行的Workflow產生錯誤,有鑑於此若要發揮Orchard的Workflow真正功用,此缺陷務必解決。
二.解法
打開Orchard Workflow模組的Controler目錄下的AdminController.cs,找到

將workflowDefinitionRecord.ActivityRecords.Clear();的程式Mark,點掉。改寫如下
[HttpPost, ActionName("Edit")]
[FormValueRequired("submit.Save")]
public ActionResult EditPost(int id, string localId, string data) {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner,
T("Not authorized to edit workflows")))
return new HttpUnauthorizedResult();
var workflowDefinitionRecord = _workflowDefinitionRecords.Get(id);
if (workflowDefinitionRecord == null) {
return HttpNotFound();
}
workflowDefinitionRecord.Enabled = true;
var state = FormParametersHelper.FromJsonString(data);
var activitiesIndex = new Dictionary<string, ActivityRecord>();
// Ezra Modified Start
//workflowDefinitionRecord.ActivityRecords.Clear();
foreach (var activity in state.Activities)
{
ActivityRecord activityRecord;
int activityId;
if (!((string)activity.ClientId).Contains("jsPlumb") &&
int.TryParse(((string)activity.ClientId).Split('_').Last(), out activityId))
{
activityRecord = workflowDefinitionRecord.ActivityRecords.First(a => a.Id == activityId);
activityRecord.X = activity.Left;
activityRecord.Y = activity.Top;
activityRecord.Start = activity.Start;
activityRecord.State = FormParametersHelper.ToJsonString(activity.State);
}
else
{
activityRecord = new ActivityRecord
{
Name = activity.Name,
X = activity.Left,
Y = activity.Top,
Start = activity.Start,
State = FormParametersHelper.ToJsonString(activity.State),
WorkflowDefinitionRecord = workflowDefinitionRecord
};
}
activitiesIndex.Add((string)activity.ClientId, activityRecord);
}
//Get deleted activities
var delWaitingActivityRecords =
from orgActivityRecord in workflowDefinitionRecord.ActivityRecords
join newActivityRecord in activitiesIndex.Values.ToList()
on orgActivityRecord.Id equals newActivityRecord.Id
into joinActivityRecords
from delActivityRecord in joinActivityRecords.DefaultIfEmpty()
where delActivityRecord == null
select orgActivityRecord;
// Check deleted activities is awaiting activity
var checkRecords = (from ar in _awaitingActivityRecords.Table
where delWaitingActivityRecords.Contains(ar.ActivityRecord)
select ar).ToList();
if (checkRecords != null && checkRecords.Count() > 0)
{
// Cancel current hibernet transaction
Services.TransactionManager.Cancel();
Services.Notifier.Error(T("Can't delete {0} activity there are awaiting activity! ",
delWaitingActivityRecords.ElementAt(0).Name));
return RedirectToAction("Edit", new { id, localId });
}
workflowDefinitionRecord.ActivityRecords.Clear();
foreach (var activityRecord in activitiesIndex.Values)
{
workflowDefinitionRecord.ActivityRecords.Add(activityRecord);
}
workflowDefinitionRecord.TransitionRecords.Clear();
foreach (var connection in state.Connections)
{
workflowDefinitionRecord.TransitionRecords.Add(new TransitionRecord
{
SourceActivityRecord = activitiesIndex[(string)connection.SourceId],
DestinationActivityRecord = activitiesIndex[(string)connection.TargetId],
SourceEndpoint = connection.SourceEndpoint,
WorkflowDefinitionRecord = workflowDefinitionRecord
});
}
// Ezra Modified End
Services.Notifier.Information(T("Workflow saved successfully"));
return RedirectToAction("Edit", new { id, localId });
}
如此一來,Workflow Editor在儲存時便不會重建Activity Record。
PS:記得要在Controller的Constructor Injection
private readonly IRepository<AwaitingActivityRecord> _awaitingActivityRecords;




























































































