TFS 2015 API c# 工作项验证无法正常工作

TFS 2015 API c# Work item validation not working properly

我验证了一个工作项,我在其中将状态更改为允许的值。它仍然说价值是错误的。

设置值和函数调用:

internal void closeWI(int tfsWIID)
{
    Log.logger.Info("Closing Item in TFS with ID: " + tfsWIID);
    Dictionary<string, object> valuesToUpdate = new Dictionary<string, object>();
    valuesToUpdate.Add("System.State", "Closed");
    valuesToUpdate.Add("System.Reason", "Work done");
    putWorkItem(valuesToUpdate, tfsWIID);
}

应用所有字段更改的通用函数:

private int putWorkItem(Dictionary<string, object> valuesToUpdate, int tfsID = 0)
{
    using (var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(Config.tfsInnovationUri))
    {
        var wiStore = projectCollection.GetService<WorkItemStore>();
        Project project = wiStore.Projects.GetById(currentTFSProjectID);
        if (wiStore != null && wiStore.Projects != null)
        {
            WorkItem wi = tfsID != 0 ? wiStore.GetWorkItem(tfsID) : new WorkItem(project.WorkItemTypes["Verification Issue"]);
            Log.logger.Info(tfsID != 0 ? "Updating TFS WI with ID: " + tfsID : "Creating new TFS WI");
            foreach (KeyValuePair<string, object> field in valuesToUpdate)
                wi.Fields[field.Key].Value = field.Value;
            wi = validateData(wi);
            wi.Save();
            return wi.Id;
        }
    }
    return 0;
}

验证:

public WorkItem validateData(WorkItem wi)
{
    var valErrors = wi.Validate();

    foreach (Field error in valErrors)
    {
        Log.logger.Error(wi.Id + " Error: " + error.Name + " val: <" + error.Value + "> allowed values are: ");
        foreach (string allowedVal in error.AllowedValues)
            Log.logger.Info(allowedVal);
    }
    return wi;
}

并且输出:

2017-07-19 17:51:11,469 [INFO] <closeWI> Closing Item in TFS with ID: 25694
2017-07-19 17:51:13,578 [ERROR] <validateData> 25694 Error: State val: <Closed> allowed values are: 
2017-07-19 17:51:13,594 [INFO] <validateData> Active
2017-07-19 17:51:13,594 [INFO] <validateData> Closed
2017-07-19 17:51:13,594 [INFO] <validateData> Integrated
2017-07-19 17:51:13,594 [INFO] <validateData> Integration skipped
2017-07-19 17:51:13,594 [INFO] <validateData> Work Complete
2017-07-19 17:51:13,594 [ERROR] <validateData> 25694 Error: Reason val: <Work done> allowed values are: 
2017-07-19 17:51:13,609 [INFO] <validateData> Cancelled
2017-07-19 17:51:13,609 [INFO] <validateData> Customer accepted
2017-07-19 17:51:13,609 [INFO] <validateData> Duplicate
2017-07-19 17:51:13,625 [INFO] <validateData> User Mistake
2017-07-19 17:51:13,625 [INFO] <validateData> Work done
[...]

所以如上所示,该值在允许值列表中,但它仍然验证错误。还有更多错误,例如未设置更改日期和更改者也不起作用,尽管有正确的用户。

当我更改 assignedTo 或 Description 等字段时,我可以确保它正常工作。它正在另一个项目中工作以改变状态。所以它与权限无关。

我没试过:

new WorkItemStore(_tfs, WorkItemStoreFlags.BypassRules);

因为它应该可以正常工作,但我会在几分钟后尝试这个。

有人知道吗?

要改变工作项状态,也需要绕过规则。看看这个问题:How to change workflow state of the newly created TFS work item through API?

正如您提到的解决方案,将 WorkItemStore 对象的 BypassRules 属性 设置为 true。为此,您必须按以下方式实例化工作项存储:

var workItemStore = new WorkItemStore(collection, WorkItemStoreFlags.BypassRules);

注意:您需要一些特殊的权限才能使用 BypassRules 标志.您的帐户需要属于 Project Collection Service Accounts 组(或 Team Foundation Service Accounts)。

如果您不知道如何操作,请按照本教程进行操作:How to add a user to Project Collection Service Account in TFS / VSO