Installation TFS API Libraries

Um auf den TFS zugreifen zu können, ist das NuGet-Paket TeamFoundation.11 zu installieren.

PM> Install-Package TeamFoundation.11

Zugriff auf den TFS

Ist am Rechner ein Workspace bereits vorhanden, kann mit dem folgenden Code alles Notwendige für den Zugriff auf die WorkItems erstellt werden:

var collectionSource = new Uri("http://tfs-server:port/tfs/MyCollection");
var collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(collectionSource);
var store = collection.GetService<WorkItemStore>();

Auch eine Authentifizierung mittels Username und Passwort ist möglich, hierzu sind die ClientCredentials der Collection zu setzen und die Authentfizierung manuell zu triggern:

NetworkCredential netCred = new NetworkCredential("UserName", "Password");
WindowsCredential winCred = new WindowsCredential(netCred);
TfsClientCredentials tfsCred = new TfsClientCredentials(winCred);

collection.ClientCredentials = tfsCred;
collection.Authenticate();

WorkItems vom TFS abfragen

Nun kann man sich mit der TFS WorkItem Query sämtliche WorkItems abfragen.

var query = "SELECT [System.Id], [System.Title] FROM WorkItems WHERE [System.ID] > 1000";
var items = store.Query(query);

In diesem Fall werden Id und Titel abgefragt und “als geöffnet” markiert. Änderungen an diesen Eigenschaften können somit vorgenommen werden.

Ein andere Möglichkeit besteht darin, sich alle Felder zurückgeben zu lassen.

var query = "SELECT * FROM WorkItems WHERE [System.ID] > 1000";
var items = store.Query(query);

Hier werden alle Informationen geladen, allerdings wird keine Eigenschaft “als geöffnet” markiert. Wird eine Eigenschaft aktualisiert und gespeichert, kommt es zu nachfolgender Ausnahme:

Microsoft.TeamFoundation.WorkItemTracking.Client.ValidationException: TF400276: You have tried to set a value for a field of a work item which is not opened or partial opened. You cannot set a value for a field of a work item which is not opened or partial opened.

Dies kann nun umgangen werden, indem zu aktualisierende Eigenschaften explizit in der Query angegeben werden, oder aber, indem das jeweilige Item mittels Aufruf der Methode Open geöffnet wird.

Auf benutzerdefinierte Eigenschaften zugreifen

Der TFS erlauft die Konfiguration von benutzerdefinierten Eigenschaften. Diese sind natürlich im Objektmodell nicht explizit bekannt. Das WorkItem bietet die Auflistung Fields an. Darüber können auch diese Felder abgerufen werden. Die Abbildung in der Datenbank sieht wie folgt aus:

TFS - benutzerdefinierte Eigenschaften
TFS – benutzerdefinierte Eigenschaften

Die benutzerdefinierten Felder werden fortlaufend nummeriert. Start ist 10000. Als Prefix wird für die DB “Fld” vergeben.

Um nun auf ein derartiges Feld zugreifen zu können, stellt die Auflistung Fields die Methode GetById zur Verfügung.

// item is WorkItem
var customFieldVal = item.Fields.GetById(10000).Value;

WorkItem speichern

Vorgenommene Änderungen können natürlich auch gespeichert werden. Dazu bietet das WorkItem die Methode Save an.

try {
  item.Save();
}
catch (ValidationException ex) {
  // handle exception
}

Beim Speichern werden Validierungsregeln angewandt und bei Nichterfüllung eine entsprechende Ausnahme geworfen.

Eine Prüfung im Vorfeld kann mittels IsValid und Validate (beides am WorkItem verfügbar) durchgeführt werden.

Sollen viele WorkItems aktualisiert werden, bietet sich eine Batch-Aktualisierung an, diese kann über den WorkItemStore durchgeführt werden:

var query = "SELECT * FROM WorkItems WHERE [System.ID] > 1000";
var items = store.Query(query);

...

store.BatchSave(items);

Finger weg von der Datenbank

Immer wieder findet man Beiträge, die Änderungen in der Datenbank vorschlagen. Davon ist Abstand zu nehmen, da die WorkItems über mehrere Tabellen hinweg gehalten werden (WorkItemsAre, WorkItemsLatest, WorkItemsWere). Direkte Änderungen können sich schnell fatal auswirken. Daher empfehle ich, immer über die API zu gehen.

Fazit

Dieser Beitrag hat zahlreiche Hilfsmittel für die Verwendung der TFS-API aufgezeigt. Damit sollten viele hilfreiche Szenarien einfach abzubilden sein. Ich denke hierbei an diverse Statistiken, Migrationen, Prozesse, die Informationen bei WorkItems hinterlegen usw. Tests sollten immer gegen ein entsprechendes Testsystem durchgeführt werden, aber das versteht sich von selbst.

Veröffentlicht von Norbert Eder

Ich bin ein leidenschaftlicher Softwareentwickler. Mein Wissen und meine Gedanken teile ich nicht nur hier im Blog, sondern auch in Fachartikeln und Büchern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Cookie-Einstellungen
Auf dieser Website werden Cookie verwendet. Diese werden für den Betrieb der Website benötigt oder helfen uns dabei, die Website zu verbessern.
Alle Cookies zulassen
Auswahl speichern
Individuelle Einstellungen
Individuelle Einstellungen
Dies ist eine Übersicht aller Cookies, die auf der Website verwendet werden. Sie haben die Möglichkeit, individuelle Cookie-Einstellungen vorzunehmen. Geben Sie einzelnen Cookies oder ganzen Gruppen Ihre Einwilligung. Essentielle Cookies lassen sich nicht deaktivieren.
Speichern
Abbrechen
Essenziell (1)
Essenzielle Cookies werden für die grundlegende Funktionalität der Website benötigt.
Cookies anzeigen