SqlWorkflowInstanceStore 可讓用戶升級自定義的應用程式特定屬性,這些屬性可用來查詢持續性資料庫中的實例。 升階屬性的動作會導致值在資料庫中的特殊檢視內使用。 這些升級的屬性(可用於使用者查詢的屬性)可以是簡單類型,例如 Int64、 Guid、 String和 DateTime,或串行化二進位類型 (byte[])。
類別 SqlWorkflowInstanceStore 具有 Promote 方法,可用來將屬性升階為可用於查詢的屬性。 下列範例是存放區擴充性的端對端範例。
在此範例案例中,文件處理 (DP) 應用程式具有工作流程,每個工作流程都會使用自定義活動來處理檔。 這些工作流程有一組狀態變數,需要讓用戶看見。 為了達成此目的,DP 應用程式會提供 類型的 PersistenceParticipant實例延伸,活動會使用此擴充功能來提供狀態變數。
class DocumentStatusExtension : PersistenceParticipant { public string DocumentId; public string ApprovalStatus; public string UserName; public DateTime LastUpdateTime; }新的擴充功能接著會新增至主機。
static Activity workflow = CreateWorkflow(); WorkflowApplication application = new WorkflowApplication(workflow); DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension (); application.Extensions.Add(documentStatusExtension);如需新增自定義持續性參與者的詳細資訊,請參閱 持續性參與者 範例。
DP 應用程式中的自定義活動會在 Execute 方法中填入各種狀態欄位。
public override void Execute(CodeActivityContext context) { // ... context.GetExtension<DocumentStatusExtension>().DocumentId = Guid.NewGuid(); context.GetExtension<DocumentStatusExtension>().UserName = "John Smith"; context.GetExtension<DocumentStatusExtension>().ApprovalStatus = "Approved"; context.GetExtension<DocumentStatusExtension>().LastUpdateTime = DateTime.Now(); // ... }當工作流程實例到達持續性點時,DocumentStatusExtension 持續性參與者的 CollectValues 方法會將這些屬性儲存到持續性數據收集中。
class DocumentStatusExtension : PersistenceParticipant { const XNamespace xNS = XNamespace.Get("http://contoso.com/DocumentStatus"); protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues) { 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; } // ... }備註
所有這些屬性都會透過 SaveWorkflowCommand.InstanceData 集合,由持續性架構傳遞至 SqlWorkflowInstanceStore。
DP 應用程式會初始化 SQL 工作流程實例存放區,並叫用 Promote 方法來升級此數據。
SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); List<XName> variantProperties = new List<XName>() { xNS.GetName("UserName"), xNS.GetName("ApprovalStatus"), xNS.GetName("DocumentId"), xNS.GetName("LastModifiedTime") }; store.Promote("DocumentStatus", variantProperties, null);根據這項升級資訊, SqlWorkflowInstanceStore 會將數據屬性放在 InstancePromotedProperties 檢視的數據行中。
若要從促銷表查詢數據子集,DP 應用程式會基於促銷檢視新增自訂檢視。
create view [dbo].[DocumentStatus] with schemabinding as select P.[InstanceId] as [InstanceId], P.Value1 as [UserName], P.Value2 as [ApprovalStatus], P.Value3 as [DocumentId], P.Value4 as [LastUpdatedTime] from [System.Activities.DurableInstancing].[InstancePromotedProperties] as P where P.PromotionName = N'DocumentStatus' go
[System.Activities.DurableInstancing.InstancePromotedProperties] 檢視
| 欄位名稱 | 欄位類型 | 說明 |
|---|---|---|
| 實例識別碼 | GUID(國際唯一識別碼) | 此升級所屬的工作流程實例。 |
| 促銷名稱 | nvarchar(400) | 促銷本身的名稱。 |
| Value1、Value2、Value3,..,Value32 | sql_variant (SQL資料型別變體) | 升階屬性本身的值。 除了長度超過8000個字節的二進位 Blob 和字元串以外,大部分的 SQL 基本數據類型都可以容納在sql_variant中。 |
| Value33、Value34、Value35、...、Value64 | varbinary(max) | 明確宣告為 varbinary(max) 之升級屬性的值。 |