Azure Ошибка DevOps Api: RuleValidationException: поле 'State' содержит значение 'Active', которого нет в списке поддерживаемых значений C# - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь создать Azure рабочих элементов DevOps программно в C#, но когда я добавляю поле System.State со значением "Active", я получаю сообщение об ошибке:

RuleValidationException: поле «State» содержит значение «Active», которого нет в списке поддерживаемых значений

Я использую два метода для создания рабочего элемента (userstory), чтобы добавить несколько рабочих элементов (задач) в эту userstory и второй способ их связывания.

// create work item. Used for both Userstory and Task.

static WorkItem CreateWorkItem(string ProjectName, string WorkItemTypeName, Dictionary<string, object> Fields)
        {
            JsonPatchDocument patchDocument = new JsonPatchDocument();

            foreach (var key in Fields.Keys)
            {
                Console.WriteLine($"{key} - {Fields[key]}");
                patchDocument.Add(new JsonPatchOperation()
                {
                    Operation = Operation.Add,

                    Path = "/fields/" + key,

                    Value = Fields[key]
                });
            }                

            return WorkItemClient.CreateWorkItemAsync(patchDocument, ProjectName, WorkItemTypeName).Result; // <==FAILS WITH ABOVE ERROR MESSAGE, after the first childitem. The parent item goes fine.
        }

// Связывание пользовательской истории и дочерних элементов.

static WorkItem LinkChildItems(int ParentWorkItemID, string ChildWorkItemUrl)
{
    JsonPatchDocument patchDocument = new JsonPatchDocument();

    patchDocument.Add(new JsonPatchOperation()
    {
        Operation = Operation.Add,

        Path = "/relations/-",

        Value = new
        {
            rel = "System.LinkTypes.Hierarchy-Forward",

            url = ChildWorkItemUrl,

            attributes = new
            {
                comment = "Automatically added using ADO API."
            }
        }
    });
    return WorkItemClient.UpdateWorkItemAsync(patchDocument, ParentWorkItemID).Result;
}

Оба метода используются в a для l oop:

// Create new parent item with params projectName, WorkItemType (here: US) and the fields of the dictionary.
var parentItem = CreateWorkItem(teamProject, "User Story", fields);

int parentItemID = parentItem.Id.GetValueOrDefault();

// Counter
int i = 1;
// Loop to create childitems.
foreach (string activity in activityList)
{
     fields["System.Title"] = $"{i}) {activity}: {WorkItemTitle}";               
     var childItem = CreateWorkItem(teamProject, "Task", fields);
     var linkChildToParent = LinkChildItems(parentItemID, childItem.Url);
     i++;
}

fields - это словарь

string WorkItemTitle = "New API used for bulk import";
Dictionary<string, object> fields = new Dictionary<string, object>();
fields.Add("System.Title", WorkItemTitle);
fields.Add("System.Description", $"Automatically created at {DateTime.Now}.");
fields.Add("Microsoft.VSTS.Common.Priority", 4);
fields.Add("System.AssignedTo", "Some Person");
fields.Add("System.State", "Active"); //<--SETS THE STATE ATTRIBUTE

Если поле System.State удалено, пользовательская история с дочерними элементами (Задачами) создается без проблем. Допустимые значения для System.State должны включать Active, Closed, New и Resolved. Если я просто создаю один элемент с System.State, установленным на "Active", это также работает. Только когда l oop используется на нескольких элементах, мой код не работает. У кого-нибудь есть идеи, почему это так?

Любая помощь приветствуется!

1 Ответ

1 голос
/ 20 февраля 2020
  1. При создании нового рабочего элемента состояние будет иметь первое значение New. Таким образом, в этом случае вы должны определить поля без System.State.

    string WorkItemTitle = "New API used for bulk import";
    Dictionary<string, object> fields = new Dictionary<string, object>();
    fields.Add("System.Title", WorkItemTitle);
    fields.Add("System.Description", $"Automatically created at {DateTime.Now}.");
    fields.Add("Microsoft.VSTS.Common.Priority", 4);
    fields.Add("System.AssignedTo", "Some Person");
    

и использовать WorkItemClient.CreateWorkItemAsync

Затем обновите System.State до Active

Dictionary<string, object> fields = new Dictionary<string, object>();
fields.Add("System.State", "Active");

и используйте WorkItemClient.UpdateWorkItemAsync с новым идентификатором рабочего элемента

...