我使用TFS API通过C#应用检查现有工作项的有效性。我知道某个WI(---)无效(通过工作项UI看到,几个字段缺少值或无效值)。但是,下面调用workitem.Validate()方法的代码返回0,或者没有无效字段。如果我遍历字段列表并使用field.IsValid属性单独检查每个结果,我会得到相同的结果。即使字段isValid值实际为false,它也始终返回true。
有趣的是,我可以让方法返回invalid / false如果我在调用行之前停止调试器并将Autos窗口(VS 2012)中的工作项扩展到我知道的无效字段之一(从而看到isValid属性实际上是" false")。如果我在调试期间不打开此属性,则值始终返回true。
有什么想法吗?这感觉好像没有正确加载,但我得到了一个干净的编译和构建。
感谢您的帮助!
TfsTeamProjectCollection teamProjectCollection = new TfsTeamProjectCollection(collectionUri);
WorkItemStore workItemStore = teamProjectCollection.GetService<WorkItemStore>();
WorkItemCollection hyperWic = workItemStore.Query("select [system.id] from workitems where [system.id] = "---");
foreach (WorkItem wi in hyperWic)
{
ArrayList wi_Validate = wi.Validate();
if (wi_Validate.Count > 0)
{
outputTextBox.Text += "Work item field is invalid" + Environment.NewLine;
}
}
答案 0 :(得分:0)
此代码适用于我(TFS 2013):
public static bool ValidateAndSave(this WorkItem wit)
{
bool valid = wit.IsValid();
if (valid)
{
wit.Save();
}
else
{
string msg = "Error saving work item, validation failed ! Errors: " + Environment.NewLine;
foreach (var field in wit.Validate().Cast<Field>())
{
msg += "Field " + field.Name + " has status " + field.Status + Environment.NewLine;
}
EventLog.WriteEntry("WemTfsSubSystem", msg);
}
return valid;
}
为未来读者提供更新:
在这种情况下的问题是WorkItem是通过WorkItemStore Query获得的,这可能是由于Cache问题所致,因此解决方案是通过WorkItemStore.GetWorkItem(id)
方法获取WorkItem。