Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 39 Entitätsaktualisierung und Zustandsverwaltung
Pfeil 39.1 Aktualisieren von Entitäten
Pfeil 39.1.1 Entitäten ändern
Pfeil 39.1.2 Hinzufügen neuer Entitäten
Pfeil 39.1.3 Löschen einer Entität
Pfeil 39.2 Der Lebenszyklus einer Entität im Objektkontext
Pfeil 39.2.1 Der Zustand einer Entität
Pfeil 39.2.2 Das Team der Objekte im Überblick
Pfeil 39.2.3 Neue Entitäten im Objektkontext
Pfeil 39.2.4 Die Zustände einer Entität
Pfeil 39.2.5 Zusätzliche Entitäten in den Datencache laden
Pfeil 39.2.6 Die Zustandsverfolgung mit »MergeOption« steuern
Pfeil 39.3 Das »ObjectStateEntry«-Objekt
Pfeil 39.3.1 Die Current- und Originalwerte abrufen
Pfeil 39.3.2 Die Methode »TryGetObjectStateEntry«
Pfeil 39.3.3 Abrufen bestimmter Gruppen
Pfeil 39.3.4 Die Methode »GetModifiedProperties«
Pfeil 39.4 Die Klasse »EntityKey«
Pfeil 39.4.1 Die Methoden »GetObjectByKey« und »TryGetObjectByKey«
Pfeil 39.5 Komplexere Szenarien
Pfeil 39.5.1 Die Methode »ChangeState«
Pfeil 39.5.2 Die Methoden »ApplyCurrentChanges« und »ApplyOriginalChanges«

Galileo Computing - Zum Seitenanfang

39.3 Das »ObjectStateEntry«-ObjektZur nächsten Überschrift

Sobald der Objektkontext eine Entität erzeugt und die Zustandsverwaltung nicht deaktiviert ist, stellt der Objektkontext zu jeder Entität auch noch ein Objekt vom Typ ObjectStateEntry bereit. Wir können also sagen, dass jede Materialisierung mit Zustandsverfolgung im Grunde genommen zwei Objekte zur Folge hat:

  • das Entitätsobjekt
  • das dazu gehörende ObjectStateEntry-Objekt

Das ObjectStateEntry-Objekt ist für die Zustandsverfolgung der zugeordneten Entität zuständig und stellt dafür entsprechende Eigenschaften und Methoden bereit, während die Entität im Grunde genommen nur die aus der Datenquelle bezogenen Daten kapselt. Da der Zustand einer Entität nicht unbedingt verfolgt werden muss, ist die Trennung zwischen Entität und ObjectStateEntry auch durchaus sinnvoll.

Sie erhalten die Referenz auf ein ObjectStateEntry-Objekt einer bestimmten Entität, wenn Sie die Methode GetObjectStateEntry des ObjectStateManagers unter Übergabe der Referenz der Entität aufrufen, z. B.:

ObjectStateManager osm = context.ObjectStateManager;
ObjectStateEntry entry = osm.GetObjectStateEntry(prod);

In diesem Codefragment repräsentiert die Variable prod die Entität, deren zugeordnetes ObjectStateEntry abgefragt wird.

Wird eine Entität vom Objektkontext getrennt (durch Aufruf der Methode Detach), wird das zugehörige ObjectStateEntry-Objekt aus dem Objektkontext entfernt.

Das ObjectStateEntry-Objekt beschreibt mit seiner Eigenschaft State nicht nur den Zustand der zugeordneten Entität (die dafür ihrerseits selbst auch noch die weiter oben angesprochene Eigenschaft EntityState hat, die der Eigenschaft State des zugeordneten ObjectStateEntry-Objekts entspricht). Darüber hinaus werden auch die Referenzen auf das übergeordnete ObjectStateManager-Objekt und das EntitySet geliefert, zu dem die Entität gehört.

Von besonderem Interesse sind insbesondere auch die Werte, die von den Eigenschaften CurrentValues und OriginalValues bereitgestellt werden. OriginalValues enthält dabei die Eigenschaftsdaten, die ursprünglich aus der Datenquelle bezogen worden sind. Sie spiegeln somit Werte des Datensatzes in der Datenbank wider. CurrentValues beschreibt hingegen die aktuellen Daten der Entität im Objektkontext, die unter Umständen vom Anwender geändert worden sind.

Ein Überblick über die wichtigsten Eigenschaften der Klasse ObjectStateEntry ist in Tabelle 39.3 zu sehen.

Tabelle 39.3 Eigenschaften der Klasse »ObjectStateEntry«

Eigenschaft Beschreibung

CurrentValues

Ruft die aktuellen Eigenschaftswerte des Objekts ab. Diese Eigenschaft ist im Grunde genommen ein Array und hat den Rückgabetyp DbDataRecord.

Entity

Ruft das Objekt ab, das dem ObjectStateEntry zugeordnet ist.

EntityKey

Ruft den EntityKey ab, der dem ObjectStateEntry-Objekt zugeordnet ist.

EntitySet

Ruft das EntitySet des Objekts ab, das dem ObjectStateEntry-Objekt zugeordnet ist.

IsRelationship

Diese Eigenschaft beschreibt einen booleschen Wert, der angibt, ob das ObjectStateEntry-Objekt eine Beziehung darstellt. Die meisten anderen Eigenschaften sind null, wenn diese Eigenschaft auf true gesetzt ist.

ObjectStateManager

Ruft den ObjectStateManager des ObjectStateEntry-Objekts ab.

OriginalValues

Ruft die originalen Eigenschaftswerte des Objekts ab. Diese Eigenschaft ist im Grunde genommen ein Array und hat den Rückgabetyp DbDataRecord.

State

Ruft den Zustand des ObjectStateEntry-Objekts ab.

Im ersten Kapitel haben Sie erfahren, dass Entitäten durch drei verschiedene Eigenschaften beschrieben werden: skalare Eigenschaften, komplexe Eigenschaften und Navigationseigenschaften. Es sei an dieser Stelle darauf hingewiesen, dass nur skalare Eigenschaften vom ObjectStateEntry-Objekt verfolgt werden, nicht jedoch komplexe Eigenschaften oder Navigationseigenschaften.


Galileo Computing - Zum Seitenanfang

39.3.1 Die Current- und Originalwerte abrufenZur nächsten ÜberschriftZur vorigen Überschrift

Das folgende Beispiel zeigt, wie die Originalwerte und aktuellen Werte einer Entität mit den Eigenschaften CurrentValues und OriginalValues abgerufen werden können.

using (NorthwindEntities context = new NorthwindEntities())
{
var cat = (context.Categories
.Where(c => c.CategoryID == 1)
.Select(c => c)).First();

// Kategoriebezeichner ändern

cat.CategoryName = "Getränke";

// ObjectStateEntry abfragen

ObjectStateManager osm = context.ObjectStateManager;
ObjectStateEntry entry = osm.GetObjectStateEntry(cat);

// aktuellen Wert abrufen

DbDataRecord actValues = entry.CurrentValues;
Console.WriteLine("Aktueller Wert: {0}",
actValues.GetValue(actValues.GetOrdinal("CategoryName")));

// Originalwert abrufen

DbDataRecord origValues = entry.OriginalValues;
Console.WriteLine("Originalwert: {0}",
origValues.GetValue(origValues.GetOrdinal("CategoryName")));
}

Listing 39.11 CurrentValue und OriginalValue abrufen

Im Beispiel wird zuerst die zu ändernde Kategorie in den Objektkontext geholt, danach die Eigenschaft CategoryName geändert. Wie wir wissen, kann das ObjectStateEntry-Objekt Auskunft über die aktuellen Werte und die Originalwerte der Eigenschaften liefern. Folglich benötigen wir die Referenz auf das entsprechende ObjectStateEntry-Objekt unserer Entität im Objektkontext. Hier hilft uns die Methode GetObjectStateEntry des ObjectStateManagers weiter, der wir als Argument die Referenz auf die Entität übergeben.

Die Eigenschaft CurrentValues (und im Folgenden auch OriginalValues) liefert ein Objekt vom Typ System.Data.Common.DbDataRecord zurück, mit dem mehrere Einzelwerte zusammengefasst werden. Bei uns ist das die Liste der Eigenschaften der Entität. Aus der gilt es, den Wert der betreffenden Eigenschaft zu ermitteln. Im Grunde genommen reicht dazu die Methode GetValue aus. Allerdings erwartet GetValue einen Integer, der den Ordinalwert der gewünschten Spalte beschreibt. Deshalb rufen wird auf die DbDataRecord deren Methode GetOrdinal auf und übergeben dabei den Eigenschaftsnamen als Zeichenfolge.

Übergeben Sie an GetObjectStateEntry ein Objekt, das nicht zustandsverwaltet wird, hat das die Ausnahme InvalidOperationException zur Folge.


Galileo Computing - Zum Seitenanfang

39.3.2 Die Methode »TryGetObjectStateEntry«Zur nächsten ÜberschriftZur vorigen Überschrift

Dasselbe Ziel wie die Methode GetObjectStateEntry verfolgt die Methode TryGetObjectStateEntry. Beide unterscheiden sich darin, wie sie auf die Angabe einer nicht vom ObjectStateManager verwalteten Entität reagieren. Während GetObjectStateEntry eine Ausnahme auslöst, gibt TryGetObjectStateEntry einen booleschen Wert zurück, der false ist. Damit eignet sich die Methode sehr gut zur Formulierung einer Bedingung. In Listing 39.12 wird das gezeigt.

using (NorthwindEntities context = new NorthwindEntities())
{
Product prod = new Product(){ ProductName = "Kuchen",
Discontinued = false };
context.AddToProducts(prod);
var osm = context.ObjectStateManager;
ObjectStateEntry entry;
if(osm.TryGetObjectStateEntry(prod, out entry))
{
var ordinal = entry.CurrentValues.GetOrdinal("ProductName");
Console.WriteLine( entry.CurrentValues.GetValue(ordinal));
}
else
Console.WriteLine("Objekt nicht im 'ObjectStateManager'");
}

Listing 39.12 Die Methode »TryGetObjectStateEntry«

Wenn Sie TryGetObjectStateEntry verwenden, müssen Sie vor dem Aufruf eine Variable vom Typ ObjectStateEntry deklarieren. An diese übergibt die Methode über den out-Parameter die Referenz des korrespondierenden ObjectStateEntry-Objekts, falls eine entsprechende Entität gefunden wird.

Sowohl die Methode GetObjectStateEntry als auch die Methode TryGetObjectStateEntry sind überladen. Anstatt der Angabe einer Entität können Sie auch ein Objekt vom Typ EntityKey angeben. Mit dem Typ EntityKey werden wir uns weiter unten beschäftigen.


Galileo Computing - Zum Seitenanfang

39.3.3 Abrufen bestimmter GruppenZur nächsten ÜberschriftZur vorigen Überschrift

Vielleicht sind Sie daran interessiert, welche Entitäten dem Objektkontext hinzugefügt oder geändert worden sind? Vielleicht möchten Sie auch gleichzeitig alle Entitäten abrufen, deren Zustand von Unchanged abweicht. Dazu müssen Sie alle ObjectStateEntry-Objekte, die Ihrer Bedingung entsprechen, aus dem Objektkontext herausfiltern. Auch dabei ist Ihnen eine Methode des ObjectStateManagers behilflich: GetObjectStateEntries. Sie übergeben der Methode einen Member der Enumeration EntityState oder, da diese Enumeration das Attribut Flags hat, mehrere Member, die bitweise kombiniert werden. Der Rückgabewert der Methode ist vom Typ IEnumerable.

Im folgenden Listing wird ein Artikel aus der Tabelle Products abgefragt und dessen Produktbezeichner geändert. Danach wird ein neuer Artikel erzeugt und dem Objektkontext mit der Methode AddToProducts hinzugefügt. Über die Methode GetObjectStateEntries werden alle ObjectStateEntry-Objekte abgefragt, deren Zustand durch Modified oder Added beschrieben wird. Die Ergebnisliste wird in einer Schleife durchlaufen und die Current-Version der Eigenschaft ProductName in die Konsole geschrieben.

using (NorthwindEntities context = new NorthwindEntities())
{

// einen Artikel dem Kontext zuordnen und editieren

var prod = context.Products
.Select(p => p).First(p => p.ProductID == 1);
prod.ProductName = "Spülmittel";

// einen neuen Artikel anlegen

Product product = new Product() { ProductName = "Senf",
Discontinued = false };
context.AddToProducts(product);

// alle Produkte abfragen, die geändert oder hinzugefügt worden sind

ObjectStateManager osm = context.ObjectStateManager;
var items = osm.GetObjectStateEntries(
EntityState.Modified | EntityState.Added);
foreach (var item in items)
{
var values = item.CurrentValues;
Console.WriteLine(values.GetValue(values.GetOrdinal("ProductName")));
}
}

Listing 39.13 Ausgabe aller editierten und hinzugefügten Entitäten


Galileo Computing - Zum Seitenanfang

39.3.4 Die Methode »GetModifiedProperties«Zur vorigen Überschrift

Das ObjectStateEntry-Objekt weist noch eine sehr interessante Methode auf: GetModifiedProperties. Die Methode gibt an den Aufrufer eine IEnumerable<string>-Liste der Eigenschaften einer Entität zurück, die sich verändert haben, also als Modified gekennzeichnet sind.

In Listing 39.14 wird der Einsatz der Methode anhand der Änderung von drei Eigenschaften eines Artikels gezeigt.

using (NorthwindEntities context = new NorthwindEntities())
{
var product = (context.Products
.Where(prod => prod.ProductID == 1)
.Select(prod => prod)).First();
product.ProductName = "Orangensaft";
product.UnitPrice = (decimal?)2.98;
product.UnitsInStock = 10;
ObjectStateManager osm = context.ObjectStateManager;
ObjectStateEntry entry = osm.GetObjectStateEntry(product);

// die Liste der veränderten Eigenschaften ausgeben

foreach (var item in entry.GetModifiedProperties())
Console.WriteLine(item);
Console.ReadLine();
}

Listing 39.14 Einsatz der Methode »ObjectStateEntry.GetModifiedProperties«



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2012

Visual C# 2012
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de