39.4 Die Klasse »EntityKey«
Jede vom Objektkontext verwaltete Entität hat ein korrespondierendes ObjectStateEntry-Objekt, in dem die aktuellen und originalen Werte der Entitätseigenschaften verfolgt werden. Der Zustand der Entitäten wird von einem ObjectStateManager-Objekt verwaltet, das dem Objektkontext zugeordnet ist.
Handelt es sich bei der Entität und dem ObjectStateEntry-Objekt um korrespondierende Objekte, werden beide über dasselbe EntityKey-Objekt miteinander verknüpft. Im Entity Data Model hat ein EntityKey dieselbe Aufgabe, die einem Primärschlüssel in einer relationalen Datenbank zukommt, nämlich Eindeutigkeit zu gewährleisten. Das EntityKey-Objekt wird automatisch erstellt, wenn die Abfrage ein Objekt zurückliefert und materialisiert. In der Regel entspricht der von EntityKey beschriebene Wert dem Wert in der Primärschlüsselspalte oder der zugrunde liegenden Tabelle.
EntityKey-Objekte weisen nicht allzu viele spezifische Merkmale auf. EntityKeyValues und IsTemporary sind die beiden Eigenschaften, die an dieser Stelle genannt werden sollen. EntityKeyValues liefert ein Array von EntityKeyMember-Objekten. Eigentlich logisch, denn ein Schlüssel kann auch aus mehreren einzelnen Schlüsseln zugeordnet werden. IsTemporary spielt im Zusammenhang mit dem Hinzufügen neuer Entitäten eine Rolle. Erzeugen Sie nämlich eine neue Entität und ordnen diese dem Objektkontext zu, wird die neue Entität dem ObjectStateManager mit einem temporären Schlüssel bekannt gegeben.
Sowohl Entitäten als auch ObjectStateEntry-Objekte verfügen über die Eigenschaft EntityKey, mit der das zugeordnete EntityKey-Objekt abgerufen werden kann.
39.4.1 Die Methoden »GetObjectByKey« und »TryGetObjectByKey«
Die weiter oben behandelten Methoden GetObjectStateEntry und TryGetObjectStateEntry setzen voraus, dass sich die entsprechende Entität bereits im Datencache befindet, und liefern als Resultat des Aufrufs ein ObjectStateEntry-Objekt zurück.
GetObjectByKey und TryGetObjectByKey hingegen liefern auf Grundlage eines Keys tatsächlich die Referenz auf eine Entität zurück. Sollte sich diese nicht im Objektkontext befinden, wird eine Abfrage gegen die Datenbank abgesetzt. Wird der angegebene Schlüssel auch in der Datenbank nicht gefunden, löst GetObjectByKey eine Ausnahme vom Typ ObjectNotFoundException aus, während TryGetObjectByKey einen booleschen Wert zurückliefert, der Auskunft gibt, ob das Objekt mit dem angegebenen EntityKey gefunden wurde (true) oder nicht (false). Im folgenden Listing wird der Einsatz der Methode TryGetObjectByKey demonstriert, bei dem eine Entität angefordert wird, die sich nicht im Cache befindet.
using (NorthwindEntities context = new NorthwindEntities())
{
EntityKey key = new EntityKey("NorthwindEntities.Products",
"ProductID", 92);
object @object;
if (context.TryGetObjectByKey(key, out @object))
{
Product product = (Product)@object;
Console.WriteLine(product.ProductName);
}
else
Console.WriteLine("Kein passendes Objekt zum Löschen gefunden.");
}
Listing 39.15 Ein Objekt mit der Methode »TryGetObjectByKey« abrufen
Um eine Entität auf Basis ihres Keys abzurufen, muss dieser erstellt werden. Dazu wird die Klasse EntityKey instanziiert, deren Konstruktor mehrfach überladen ist. Im einfachsten Fall geben Sie zuerst die Entitätsmenge als Zeichenfolge an, die durch Voranstellung des EntityContainers qualifiziert werden muss. Das zweite Argument gibt das Schlüsselfeld als Zeichenfolge an und das dritte den Schlüsselwert.
Das gebildete EntityKey-Objekt wird an den ersten Parameter der Methode TryGetObjectByKey übergeben. Der zweite Parameter ist ein out-Parameter, in den die Methode die gefundene Entität einträgt. Sie können nun, wie im Listing, Eigenschaften abfragen, Sie können die Entität aber auch editieren oder löschen.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.