【问题标题】:TFS 2015 API c# Work item validation not working properlyTFS 2015 API c#工作项验证无法正常工作
【发布时间】:2017-07-24 19:40:19
【问题描述】:

我验证了我将状态更改为允许值的工作项。它仍然说值是错误的。

设置值和函数调用:

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
[...]

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

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

我没试过:

new WorkItemStore(_tfs, WorkItemStoreFlags.BypassRules);

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

有人有想法吗?

【问题讨论】:

    标签: c# tfs tfs-2015


    【解决方案1】:

    要更改工作项状态,还需要绕过规则。看看这个问题: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 服务帐户)中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多