看起来 TFS 2013 的行为也没有改变。我遇到了完全相同的问题,这是我在拆卸工具和一点运气的帮助下发现的。
每种类型的链接都Equals
以自己的方式实现该方法。据我所知,它是唯一标识链接对象的内部字段的组合。对于超链接,只有目标路径很重要。
这里RelatedLink
有点特别。首先,它的Equals
方法比较了几个内部字段,特别是源 id 和目标 id。
当您刚刚创建一个RelatedLink
对象时,它的目标 id 指向null
. 这是有道理的——您没有添加到工作项的链接,并且它不知道它与什么相关。
现在,在代码的第二行中,您调用Contains
方法,它返回false
. 始终false
为新创建的链接!那是因为该Contains
方法是通过调用Equals
方法的方式实现的,该方法通过源ID和目标ID比较相关链接。但是目标 id 总是null
用于刚刚创建的相关链接。另一方面,workItem.Links
collection 中每个对象的目标 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 的人:)