我正在尝试为我的应用程序编写示例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函数时,我可以看到代码运行正常,我能够在即时窗口中看到值。但数据不会存储在商店中。
关于可能出错的指示?
我怀疑我是否正确使用名称空间
静态XNamespace xNS = XNamespace.Get(“IamaUniqueNamespace”);
我尝试了一些名称,包括Workflow 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] 现在我想到了,我提出这个问题的方式可能不太清楚。