C# 工作流基础-持久性额外数据 我使用工作流基金会和ASP.NET创建了一个小型应用程序。 我在流程图中提供了多个与人交互的步骤。 对于涉及持久性的工作流的每个步骤(=在每次人机交互之前),我希望保存/更新一个额外的参数,如“worklow对象”,其中包含很少的字符串属性
我已经研究了存储的扩展性解决方案(),但无法启动并运行它:用于持久性的数据库的表“InstancePromotedPropertiesTable”没有更新,并且是完全空的 MSDN中是否有未提及的具体行动 是否有其他解决方案可以将额外的自定义数据附加到工作流程中,我们可以在简历期间或之前读取/写入这些数据 根据MSDN上提供的文档,以下是我的代码示例: 创建工作流应用程序:C# 工作流基础-持久性额外数据 我使用工作流基金会和ASP.NET创建了一个小型应用程序。 我在流程图中提供了多个与人交互的步骤。 对于涉及持久性的工作流的每个步骤(=在每次人机交互之前),我希望保存/更新一个额外的参数,如“worklow对象”,其中包含很少的字符串属性,c#,asp.net,workflow,workflow-foundation,C#,Asp.net,Workflow,Workflow Foundation,我已经研究了存储的扩展性解决方案(),但无法启动并运行它:用于持久性的数据库的表“InstancePromotedPropertiesTable”没有更新,并且是完全空的 MSDN中是否有未提及的具体行动 是否有其他解决方案可以将额外的自定义数据附加到工作流程中,我们可以在简历期间或之前读取/写入这些数据 根据MSDN上提供的文档,以下是我的代码示例: 创建工作流应用程序: private WorkflowApplication CreateWorkflow<T>(I
private WorkflowApplication CreateWorkflow<T>(IDictionary<string, object> dictionary) where T : Activity, new()
{
WorkflowApplication workflowApplication;
if (dictionary.Any())
{
workflowApplication = new WorkflowApplication(new T(), dictionary);
}
else
{
workflowApplication = new WorkflowApplication(new T());
}
workflowApplication.InstanceStore = new SqlWorkflowInstanceStore(InstanceStoreConnectionString);
workflowApplication.PersistableIdle = (e) =>
{
return PersistableIdleAction.Persist;
};
workflowApplication.Completed = (e) =>
{
_isCompleted = true;
_instanceUnloaded.Set();
};
workflowApplication.Idle = (e) =>
{
_instanceUnloaded.Set();
};
workflowApplication.Unloaded = (e) =>
{
};
DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension();
workflowApplication.Extensions.Add(documentStatusExtension);
return workflowApplication;
}
私有工作流应用程序CreateWorkflow(IDictionary dictionary),其中T:Activity,new()
{
工作流应用程序工作流应用程序;
if(dictionary.Any())
{
workflowApplication=新的workflowApplication(新的T(),字典);
}
其他的
{
workflowApplication=新的workflowApplication(新的T());
}
workflowApplication.InstanceStore=新的SqlWorkflowInstanceStore(InstanceStoreConnectionString);
workflowApplication.PersistableIdle=(e)=>
{
返回PersistableIdleAction.Persist;
};
workflowApplication.Completed=(e)=>
{
_isCompleted=真;
_instanceUnload.Set();
};
workflowApplication.Idle=(e)=>
{
_instanceUnload.Set();
};
workflowApplication.Unload=(e)=>
{
};
DocumentStatusExtension DocumentStatusExtension=新建DocumentStatusExtension();
workflowApplication.Extensions.Add(documentStatusExtension);
返回工作流应用程序;
}
进入空闲前执行步骤的方法:
protected override void Execute(NativeActivityContext context)
{
var bookmarkName = context.GetValue(StepName);
context.GetExtension<DocumentStatusExtension>().DocumentId = Guid.NewGuid().ToString();
context.GetExtension<DocumentStatusExtension>().UserName = "John Smith";
context.GetExtension<DocumentStatusExtension>().ApprovalStatus = "Approved";
context.GetExtension<DocumentStatusExtension>().LastUpdateTime = DateTime.Now;
// Create a bookmark allows the persistance in the DB
context.CreateBookmark(bookmarkName, new BookmarkCallback(this.Continue));
}
protected override void Execute(NativeActivityContext上下文)
{
var bookmarkName=context.GetValue(StepName);
context.GetExtension().DocumentId=Guid.NewGuid().ToString();
context.GetExtension().UserName=“John Smith”;
context.GetExtension().ApprovalStatus=“已批准”;
context.GetExtension().LastUpdateTime=DateTime.Now;
//创建书签允许数据库中的持久性
CreateBookmark(bookmarkName,newbookmarkcallback(this.Continue));
}
以及调用升级方法的PersistenceParticipant类:
public class DocumentStatusExtension : PersistenceParticipant
{
public string DocumentId;
public string ApprovalStatus;
public string UserName;
public DateTime LastUpdateTime;
protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues)
{
//All these properties are passed to SqlWorkflowInstanceStore by the persistence framework through the SaveWorkflowCommand.InstanceData collection.
XNamespace xNS = XNamespace.Get("http://contoso.com/DocumentStatus");
readWriteValues = new Dictionary<XName, object>();
readWriteValues.Add(xNS.GetName("UserName"), this.UserName);
readWriteValues.Add(xNS.GetName("ApprovalStatus"), this.ApprovalStatus);
readWriteValues.Add(xNS.GetName("DocumentId"), this.DocumentId);
readWriteValues.Add(xNS.GetName("LastModifiedTime"), this.LastUpdateTime);
writeOnlyValues = null;
SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(System.Configuration.ConfigurationManager.AppSettings["InstanceStoreConnectionString"]);
List<XName> variantProperties = new List<XName>()
{
xNS.GetName("UserName"),
xNS.GetName("ApprovalStatus"),
xNS.GetName("DocumentId"),
xNS.GetName("LastModifiedTime")
};
store.Promote("DocumentStatus", variantProperties, null);
}
}
公共类DocumentStatusExtension:PersistenceParticipant
{
公共字符串DocumentId;
公共字符串批准状态;
公共字符串用户名;
公共日期时间LastUpdateTime;
受保护的重写无效集合值(out IDictionary readWriteValues,out IDictionary writeOnlyValues)
{
//持久性框架通过SaveWorkflowCommand.InstanceData集合将所有这些属性传递给SqlWorkflowInstanceStore。
XNamespace xNS=XNamespace.Get(“http://contoso.com/DocumentStatus");
readWriteValues=新字典();
readWriteValues.Add(xNS.GetName(“用户名”)、this.UserName);
readWriteValues.Add(xNS.GetName(“ApprovalStatus”)、this.ApprovalStatus);
readWriteValues.Add(xNS.GetName(“DocumentId”)、this.DocumentId);
readWriteValues.Add(xNS.GetName(“LastModifiedTime”)、this.LastUpdateTime);
writeOnlyValues=null;
SqlWorkflowInstanceStore=新的SqlWorkflowInstanceStore(System.Configuration.ConfigurationManager.AppSettings[“InstanceStoreConnectionString]”);
列表变量属性=新列表()
{
xNS.GetName(“用户名”),
xNS.GetName(“ApprovalStatus”),
xNS.GetName(“DocumentId”),
xNS.GetName(“LastModifiedTime”)
};
store.Promote(“DocumentStatus”,variantProperties,null);
}
}
谢谢大家! 我认为我们需要查看您的代码来诊断为什么没有填充表,但是您是否考虑过只处理WorkflowRuntime.WorkflowPersisted事件并显式写入关联参数?或者重写持久性服务?我已经在初始请求中添加了我的代码示例。我认为我们需要查看您的代码来诊断为什么不填充表,但是您是否考虑过只处理WorkflowRuntime.WorkflowPersisted事件并显式写入您的关联参数?或者重写持久性服务?我已经在初始请求中添加了代码示例