アプリケーションの PersistenceParticipant のサンプルを作成しようとしています。
[System.Activities.DurableInstancing].[InstancePromotedProperties] にプロパティを保存していません。
ワークフローでエラーが発生しているようには見えませんが、保存も行われません。
public class MyPersistanceParticipant : PersistenceParticipant
{
public string MovieName;
public string Rating;
public Decimal Price;
static XNamespace xNS = XNamespace.Get("IamaUniqueNamespace");
//static XNamespace test = XNamespace.Get("clr-namespace:MovieRental.DataModel;assembly=MovieRental.DataModel");
//static XName currentCountName = stepCountNamespace.GetName("MovieName");
protected override void CollectValues(out IDictionary<System.Xml.Linq.XName, object> readWriteValues, out IDictionary<System.Xml.Linq.XName, object> writeOnlyValues)
{
//readWriteValues = new Dictionary<XName, object>();
//readWriteValues.Add(xNS.GetName("MovieName"), this.MovieName);
//readWriteValues.Add(xNS.GetName("Rating"), this.Rating);
//readWriteValues.Add(xNS.GetName("Price"), this.Price);
readWriteValues = null;
writeOnlyValues = new Dictionary<XName, object>();
writeOnlyValues.Add(xNS.GetName("MovieName"), this.MovieName);
writeOnlyValues.Add(xNS.GetName("Rating"), this.Rating);
writeOnlyValues.Add(xNS.GetName("Price"), this.Price);
//base.CollectValues(out readWriteValues, out writeOnlyValues);
}
protected override void PublishValues(IDictionary<XName, Object> readWriteValues)
{
object loadedData;
if (readWriteValues.TryGetValue(MovieName, out loadedData))
{
this.MovieName = (string)loadedData;
}
}
protected override IDictionary<XName, object> MapValues(IDictionary<XName, object> readWriteValues, IDictionary<XName, object> writeOnlyValues)
{
return base.MapValues(readWriteValues, writeOnlyValues);
}
}
以下のコードを使用して、永続ストアをアプリケーションに追加しました
MyPersistanceParticipant ps = new MyPersistanceParticipant();
_wfApp.Extensions.Add(ps);
コードアクティビティも追加しました
public class MakePersistanceHappen : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
context.GetExtension<MyPersistanceParticipant>().MovieName = "Pursuit of Persistance";
context.GetExtension<MyPersistanceParticipant>().Rating = "VH";
context.GetExtension<MyPersistanceParticipant>().Price = Convert.ToDecimal(1);
}
}
CollectValues 関数をデバッグすると、コードが正しく実行されていることがわかり、即時ウィンドウで値を確認できます。しかし、データはストアに保存されません。
何が間違っている可能性がありますか?
名前空間を正しく使用しているか疑わしい
static XNamespace xNS = XNamespace.Get("IamaUniqueNamespace");
ワークフロー XAML ファイルの名前を含め、いくつかの名前を試しましたが、どれも機能しないようです。何が問題なのかをデバッグする方法はありますか? エラーはまったく発生しません。
編集 1: [System.Activities.DurableInstancing].[InstancePromotedPropertiesTable] に保存されるように新しい昇格されたプロパティを追加しなければならなかった問題を解決でき、クエリ文字列が正しいことを確認しました。
//Add promoted properties
XNamespace dataNamespace = XNamespace.Get("IamaUniqueNamespace");
List<XName> variantProperties = new List<XName>();
variantProperties.Add(dataNamespace.GetName("MovieName"));
variantProperties.Add(dataNamespace.GetName("Rating"));
variantProperties.Add(dataNamespace.GetName("Price"));
_instanceStore.Promote("additionalProperty", variantProperties, null);
InstanceHandle handle = _instanceStore.CreateInstanceHandle();
InstanceView view = _instanceStore.Execute(handle,
new CreateWorkflowOwnerCommand(),
TimeSpan.FromSeconds(5));
handle.Free();
_instanceStore.DefaultInstanceOwner = view.InstanceOwner;
// Add instance stoe to app
wfApp.InstanceStore = _instanceStore;
// Add persistance participant as extension
MyPersistanceParticipant mp = new MyPersistanceParticipant();
wfApp.Extensions.Add(mp);
編集 2: この質問の背後にある私の意図は、PersistenceParticipant に [System.Activities.DurableInstancing].[InstancePromotedPropertiesTable] に追加のプロパティを格納させることでした。