Freigeben über


Verwalten der Datenparallelität

WCF RIA Services unterstützt vollständige Parallelität, um die Konsistenz von Daten sicherzustellen, und setzt voraus, dass Entwickler die erforderliche Logik zur Behandlung möglicher Konflikte bereitstellen, die beim Aktualisieren einer Datenquelle auftreten können. Wenn Sie Benutzern das Aktualisieren oder Löschen von Daten ermöglichen, sollten Sie sicherstellen, dass die Daten in der Datenquelle nicht von einem anderen Prozess geändert wurden, bevor Sie ungeprüft die Werte in einem Datensatz aktualisieren oder löschen. Wenn Sie nicht überprüfen, ob sich die Werte geändert haben, können Sie versehentlich Werte überschreiben, die von einem anderen Prozess festgelegt wurden, und so Inkonsistenzen der Daten verursachen. Bei der vollständigen Parallelität wird davon ausgegangen, dass solche Konflikte selten auftreten. Dennoch wird der aus der Datenquelle abgerufene Wert, der geändert oder gelöscht werden soll, mit dem aktuellen Wert der Quelle verglichen. Wenn die Werte nicht übereinstimmen, wird eine OptimisticConcurrencyException ausgelöst, die behandelt werden muss.

Verfahren für die Angabe von Prüfwerten für eine Konsistenzprüfung finden Sie unter Gewusst wie: Aktivieren von Prüfungen der vollständigen Parallelität. Informationen zur Verwendung von expliziten Transaktionen, mit denen die Konsistenz sichergestellt wird, finden Sie unter Gewusst wie: Hinzufügen von expliziten Transaktionen zu einem Domänendienst

Verwenden der Parallelitätsattribute

RIA Services übergibt standardmäßig nicht die gesamte ursprüngliche Entität zusammen mit den geänderten Werten an die Datenzugriffsebene, um die Datenparallelität zu überprüfen. Stattdessen speichert und übergibt RIA Services nur die Member, die mit dem Attribut RoundtripOriginalAttributeConcurrencyCheckAttribute oder TimestampAttribute markiert sind.

Jedes dieser Attribute kann auf Eigenschaften in einer Metadatenklasse oder, beim Arbeiten mit Entity Framework, auf die Metadatenklasse selbst angewendet werden. Sie können auch direkt auf Eigenschaften oder Klassen von CLR-Typen angewendet werden, wenn Sie mit POCO-Datenmodellen arbeiten. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen von Metadatenklassen. Wenn Sie nach dem Anwenden der Attribute einen Buildvorgang ausführen, werden die entsprechenden Attribute im generierten Clientcode für die Eigenschaften oder Klassen angezeigt. Wenn ein Attribut auf eine ganze Klasse und nicht auf einzelne Eigenschaften einer Klasse angewendet wird, ist dies gleichbedeutend mit dem Anwenden des Attributs auf alle Member der Klasse. Das ConcurrencyCheckAttribute-Attribut und das TimestampAttribute-Attribut erzwingen zusätzlich die Angabe von RoundtripOriginalAttribute für die Clienteigenschaft oder -klasse, auf die die Attribute in den Metadaten des Domänendiensts angewendet wurden. Diese Implementierung ermöglicht es Ihnen, die Leistung der Anwendung zu optimieren, indem Sie nur die Member angeben, die Teil der Parallelitätsüberprüfung sein sollen. Weitere Informationen finden Sie unter

Important Hinweis:
Wenn KeyAttribute auf die Eigenschaft eines Entitätstyps angewendet wird, wird der entsprechenden Eigenschaft beim Erstellen des Projekts auch RoundtripOriginalAttribute hinzugefügt. In Domänendiensten, die mit dem Assistenten Neue Domänendienstklasse hinzufügen aus einer Datenquelle erzeugt werden, ist dies das Standardverhalten für alle Eigenschaften, die als Entitätsschlüssel verwendet werden.

Wenn RoundtripOriginalAttribute angewendet wird, vergleicht die Datenzugriffsebene den zuvor abgerufenen ursprünglichen Wert aus der Datenquelle mit dem Datenwert, der aktuell in der Datenquelle gespeichert ist. Wenn die Werte identisch sind, haben sich die Daten im Speicher nicht geändert. In diesem Fall werden die Daten von der Datenzugriffsebene aktualisiert bzw. gelöscht. Wenn sich die Daten geändert haben, tritt ein Konflikt auf, und eine OptimisticConcurrencyException wird ausgelöst. In der EntityConflict-Eigenschaft der Entität, deren Daten nicht mehr aktuell sind, werden Informationen zum Konflikt gespeichert.

Wenn Sie das ExcludeAttribute-Attribut auf einen Member in einer Entität anwenden, die aktualisiert oder vom Client gelöscht werden kann, darf dieser Member nicht für Überprüfungen auf vollständige Parallelität verwendet werden. Wird der Member ausgeschlossen, dann wird der korrekte ursprüngliche Wert für diesen Member nicht gespeichert, und der Aktualisierungsvorgang schlägt immer fehl. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen von Metadatenklassen.

Behandeln der OptimisticConcurrencyException

Wenn Datenänderungen im Objektcache mit Änderungen in Konflikt stehen, die in der Datenquelle vorgenommen wurden, nachdem die Objekte dem Cache hinzugefügt oder dort aktualisiert wurden, wird die gesamte Transaktion zurückgenommen. Wenn eine OptimisticConcurrencyException auftritt, sollten Sie die Ausnahme behandeln und angeben, ob der Konflikt aufgelöst werden soll, indem die Daten in den Objektdaten beibehalten werden (Client gewinnt) oder ob der Objektcache mit den Daten aus der Datenquelle aktualisiert werden soll (Speicher gewinnt). Informationen und Anleitungen hierzu finden Sie unter Speichern von Änderungen und Verwalten von Parallelität