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(假设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的人:(