2

如果我做:

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

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

TF237099:重复的工作项链接。

那么 Contains 真正检查的是什么?引用相等?肯定不是吗?

有人对如何处理这个问题有一些提示吗?我正在编写一个工具来将需求从众所周知的工具迁移到 TFS。

4

2 回答 2

3

因此,您有一个给定的 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() 它有什么作用?” --> 我没有答案。
我希望你能以某种方式利用我上面实现的东西。

于 2011-10-24T14:16:08.207 回答
3

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

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

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

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

现在,在代码的第二行中,您调用Contains方法,它返回false. 始终false为新创建的链接!那是因为该Contains方法是通过调用Equals方法的方式实现的,该方法通过源ID和目标ID比较相关链接。但是目标 id 总是null用于刚刚创建的相关链接。另一方面,workItem.Linkscollection 中每个对象的目标 id 都是 never 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显式导致错误的数据。

PS我明白在3年内得到答案没有任何价值。希望这可以帮助其他将工作项从“知名系统”迁移到 TFS 的人:)

于 2014-10-31T21:16:10.497 回答