WorkItem.Links.Contains()它做什么

本文关键字:什么 Links Contains WorkItem | 更新日期: 2023-09-27 18:12:06

如果我这样做:

RelatedLink newLink = new RelatedLink(linkTypeEnd, id);
if (workItem.Links.Contains(newLink)) return;
workItem.Links.Add(newLink);

它仍然在带有ValidationException的Add方法上崩溃,声明链接已经在集合中。

TF237099:重复的工作项链接。

那么Contains真正检查的是什么呢?参考平等?肯定不是吗?

有人知道如何处理这个问题吗?我正在编写一个工具,将Requirements从一个众所周知的工具迁移到TFS。

WorkItem.Links.Contains()它做什么

因此您有一个给定的WorkItem(假设ID为1000(&您想向其中添加一个相关的WorkItem(假设ID为1001(
只需

workItem.Links.Add(newLink);

不会起作用,因为如果WI 1001已经是WI 1000的链接,它会抛出您提供的异常。

因此,在添加之前,我们需要检查WI 1001是否已经在1000的链接中。这可能如下:

WorkItem workItem = workItemStore.GetWorkItem(1000);  
LinkCollection links = workItem.Links;
List<int> relatedWorkItemIds = new List<int>();
foreach (var link in links)
{
   relatedWorkItemIds.Add(((Microsoft.TeamFoundation.WorkItemTracking.Client.RelatedLink) (link)).RelatedWorkItemId);
}
if(relatedWorkItemIds.Contains(1001))
{
   return;
}
else
{
   WorkItemLinkTypeEnd linkTypeEnd = workItemStore.WorkItemLinkTypes.LinkTypeEnds["Child"]; 
   RelatedLink newLink = new RelatedLink(linkTypeEnd, 1001);
   workItem.Links.Add(newLink);
}

在回答问题的过程中,我意识到你直接问"WorkItem.Links.Contains((它做什么?"-->我没有答案
我希望你能以某种方式利用我上面实现的内容。

看起来TFS 2013的行为也没有改变。我遇到了完全相同的问题,这是我在拆卸工具和运气的帮助下发现的。

每种类型的链接都以自己的方式实现Equals方法。据我所知,它是内部字段的组合,唯一标识链接对象。对于超链接,它是唯一重要的目标路径。

RelatedLink在这里有点特别。首先,它的Equals方法比较了几个内部字段,特别是源id和目标id。

当您刚刚创建了一个RelatedLink对象时,它的目标id指向null。这是有道理的——你还没有添加到工作项的链接,它也不知道它与什么有关。

现在,在代码的第二行中,调用Contains方法,它返回false。对于新创建的链接,始终使用false!这是因为Contains方法是以调用Equals方法的方式实现的,该方法通过源id和目标id来比较相关链接。但对于刚刚创建的相关链接,目标id始终为null。另一方面,workItem.Links集合中的每个对象的目标id从来都不是null

因此,Contains方法在这种情况下是无用的。我最终得到了一个丑陋的解决方案,但至少它不需要维护具有ID:的外部集合

RelatedLink newLink = new RelatedLink(linkTypeEnd, id);
if (workItem.Links.Cast<Link>().FirstOrDefault(l => l.GetType() == typeof(RelatedLink) && ((RelatedLink)l).RelatedWorkItemId == relatedLink.RelatedWorkItemId) == null) 
//if (workItem.Links.Contains(newLink)) 
  return;
workItem.Links.Add(newLink);

因此,我不依赖于Contains方法,而是检查可能相同的数据,这些数据可能会显式地导致duplicate relation错误。

附言:我知道在3年内得到答案是没有价值的。希望这能帮助其他将工作项从"众所周知的系统"迁移到TFS的人:(