Daten

In diesem Abschnitt wird beschrieben, wie Szenarien, die das Modellieren von Daten, Überprüfen der Gültigkeit der Daten und Sicherstellen der Datenparallelität beinhalten, in WCF RIA Services gehandhabt werden. Wenn Sie eine Schnittstelle zum Aktualisieren, Löschen oder Erstellen von Daten vom Client einer Rich Internet Application (RIA) bereitstellen, müssen Sie häufig einige komplizierte Datenbeziehungen modellieren und vor dem Commit für die Datenänderungen sicherstellen, dass die Daten vom Benutzer gültig sind und den Daten in der Datenquelle entsprechen.

Normalerweise werden Daten in einer relationalen Datenbank mit dem Entity Data Model oder LINQ to SQL modelliert. In einem RIA Services -Projekt ist es jedoch nicht erforderlich, eine Datenbank zu verwenden. Sie können Daten mit jedem beliebigen Objekttyp speichern. Der Code im Clientprojekt für Datenvorgänge ist insofern datenquellenagnostisch, als er die von der mittleren Ebene verwendete Datenzugriffstechnologie bzw. das Schema tatsächlich nicht erkennt.

Datenbeziehungen

RIA Services stellt Funktionen bereit, die Ihnen die Interaktion mit komplizierten Datenbeziehungen ermöglichen, z. B. mit hierarchischen Modellen, polymorphen Vererbungsmodellen, Darstellungsmodellen, die Werte von vielen Entitäten konsolidieren, und Modellen, die Werte aus mehreren Domänendiensten enthalten. Das hierarchische Modell stellt eine zusammengesetzte Über-/Untergeordnet-Beziehung dar (z. B. Order und OrderDetails) oder eine rekursive Beziehung (z. B. ein Employee-Modell mit einem Feld für eine ManagerID, das auf eine andere Entität im Employee-Modell verweist). Weitere Informationen finden Sie unter Festgelegte Hierarchien.

In einem Vererbungsmodell können Sie eine Datenstruktur darstellen, die eine Customer-Entität und zwei davon abgeleitete Entitäten enthält: PublicSectorCustomer und PrivateSectorCustomer. Mit Domänenvorgängen können Sie die Typen abfragen und aktualisieren. Weitere Informationen finden Sie unter Vererbung in Datenmodellen.

Unterstützung für komplexe Nichtentitätstypen wurde in RIA Services V1.0 SP1 hinzugefügt. Im Besonderen werden CODEGEN, Metadaten, umfassende Validierung, Änderungsnachverfolgung, Bearbeitungssitzungen und komplexe Typparameter unterstützt. Dies bedeutet, dass benutzerdefinierte Typen wie Address jetzt als Entitätseigenschaften oder Parameter bzw. Rückgabewerte für/von DomainService-Methoden verwendet werden können. Weitere Informationen finden Sie in den Themen unter Komplexe Typen.

Unterstützung für die Freigabe einer Entität für mehrere Domänendienste wurde in RIA Services V1.0 SP1 hinzugefügt. Dies bietet die erforderliche Flexibilität für eine logischere Unterteilung der DomainService-Klassen. Weitere Informationen finden Sie im Thema Gemeinsam verwendete Entitäten.

In einem Darstellungsmodell können Sie Typen für die Präsentationsebene erstellen, die nicht direkt an die Struktur der Datenquellentabellen gebunden sind. Sie können z. B. einen Datentyp mit dem Namen CustomerPresentation erstellen, der auf Datenklassen für die Tabellen "Customer", "CustomerAddress" und "Address" basiert. Im Darstellungstyp aggregieren Sie nur die Werte, die für die Präsentationsebene relevant sind. Wenn Änderungen im Datenrepository vorgenommen werden, können Sie nur den Darstellungstyp ändern, ohne die mit den Daten interagierende Codeclientanwendung zu aktualisieren. RIA Services ermöglicht es Ihnen, Daten anhand des Darstellungstyps zu aktualisieren. Weitere Informationen finden Sie unter Darstellungsmodelle.

In der Anwendung müssen Sie möglicherweise auch Daten aus einer Vielzahl von Datenquellen anzeigen oder eine einzelne Entität für mehrere Domänendienste verfügbar machen. RIA Services ermöglicht dieses Szenario, da Verweise zwischen Entitäten unterschiedlicher DomainContext-Typen unterstützt werden. Bei einer E-Commerce-Website kann es z. B. erforderlich sein, Daten aus dem Auftragsverarbeitungssystem und Produkte von einem Drittanbieter-Domänendienst zu integrieren. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Freigeben von Entitäten zwischen mehreren Domänendiensten.

Datenanmerkungen und Validierung

Wenn Sie Datenklassen in der RIA Services -Anwendung verwenden, können Sie Attribute zum Angeben von Validierungsregeln auf die Klasse oder Member anwenden, festlegen, wie die Daten angezeigt werden, und Beziehungen zwischen Entitätsklassen festlegen. Der System.ComponentModel.DataAnnotations-Namespace enthält die Klassen, die als Datenattribute verwendet werden. Durch das Anwenden dieser Attribute auf die Datenklasse oder den Member zentralisieren Sie die Datendefinition. Die gleichen Regeln müssen so nicht an mehreren Orten erneut angewendet werden. Die Datenanmerkungsattribute sind in drei Kategorien organisiert: Validierungsattribute, Anzeigeattribute und Datenmodellierungsattribute. Weitere Informationen finden Sie unter Anpassen von Datenklassen mithilfe von Datenanmerkungen and Gewusst wie: Validieren von Daten. Zur Validierung können die folgenden Attribute verwendet werden:

  1. DataTypeAttribute

  2. RangeAttribute

  3. RegularExpressionAttribute

  4. RequiredAttribute

  5. StringLengthAttribute

  6. CustomValidationAttribute

Bei der Verwendung von automatisch generierten Datenklassen wie Entity Data Model- oder LINQ to SQL-Klassen können Sie die Attribute nicht direkt auf die generierten Klassen anwenden, da die Attribute bei der nächsten erneuten Generierung der Klasse verloren gehen. Stattdessen erstellen Sie für die Datenklasse eine Metadatenklasse, auf die Sie die Attribute anwenden. Eine Metadatenklasse ist eine partielle Klasse, die von der Datenklasse als Metadatentyp festgelegt wird. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen von Metadatenklassen.

Das folgende Beispiel zeigt eine Metadatenklasse, bei der die Attribute RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute und ExcludeAttribute auf einige der Eigenschaften angewendet wurden.

<MetadataTypeAttribute(GetType(Address.AddressMetadata))>  _
Partial Public Class Address
    
    Friend NotInheritable Class AddressMetadata
        
        'Metadata classes are not meant to be instantiated.
        Private Sub New()
            MyBase.New
        End Sub
        
        Public AddressID As Integer

        <Required()> _
        <StringLength(60)> _
        <RoundtripOriginal()> _
        Public AddressLine1 As String

        <RoundtripOriginal()> _
        Public AddressLine2 As String

        <Required()> _
        <StringLength(30)> _
        <RoundtripOriginal()> _
        Public City As String

        <RoundtripOriginal()> _
        Public CountryRegion As String
        
        Public CustomerAddresses As EntityCollection(Of CustomerAddress)

        <RoundtripOriginal()> _
        Public ModifiedDate As DateTime

        <Required()> _
        <RoundtripOriginal()> _
        Public PostalCode As String

        <Exclude()> _
        Public rowguid As Guid

        <RoundtripOriginal()> _
        Public StateProvince As String
    End Class
End Class
[MetadataTypeAttribute(typeof(Address.AddressMetadata))]
public partial class Address
{

    internal sealed class AddressMetadata
    {
        // Metadata classes are not meant to be instantiated.
        private AddressMetadata()
        {
        }

        public int AddressID { get; set; }

        [Required]
        [StringLength(60)]
        [RoundtripOriginal]
        public string AddressLine1 { get; set; }

        [RoundtripOriginal]
        public string AddressLine2 { get; set; }

        [Required]
        [StringLength(30)]
        [RoundtripOriginal]
        public string City { get; set; }

        [RoundtripOriginal]
        public string CountryRegion { get; set; }

        public EntityCollection<CustomerAddress> CustomerAddresses { get; set; }

        [RoundtripOriginal]
        public DateTime ModifiedDate { get; set; }

        [Required]
        [RoundtripOriginal]
        public string PostalCode { get; set; }

        [Exclude]
        public Guid rowguid { get; set; }

        [RoundtripOriginal]
        public string StateProvince { get; set; }
    }
}

Sie können ein benutzerdefiniertes Validierungsattribut erstellen, indem Sie eine freigegebene Codedatei hinzufügen und in dieser Datei eine Klasse erstellen, die die Validierungslogik implementiert. Damit die Klasse ordnungsgemäß im Clientprojekt generiert wird, müssen Sie beim Definieren der benutzerdefinierten Validierungsklasse zumindest etwas Code angeben, bei dem es sich nicht um automatisch implementierte Eigenschaften handelt. Ein Beispiel finden Sie unter Gewusst wie: Validieren von Daten.

Die Entity-Klasse implementiert die INotifyDataErrorInfo-Schnittstelle. Diese Schnittstelle definiert Member, die synchrone und asynchrone Validierungsunterstützung bereitstellen. Mit der INotifyDataErrorInfo-Schnittstelle werden dem Clientprojekt Validierungsfehler mitgeteilt, ohne eine Ausnahme auszulösen. Weitere Informationen zu INotifyDataErrorInfo finden Sie unter INotifyDataErrorInfo-Schnittstelle.

Zum Zurückgeben des Ergebnisses einer Validierungsüberprüfung erstellen Sie eine Instanz der ValidationResult-Klasse.

Das folgende Beispiel zeigt eine benutzerdefinierte Validierungsklasse, die die Ergebnisse mithilfe einer Instanz der ValidationResult-Klasse zurückgibt.

Imports System
Imports System.ComponentModel.DataAnnotations

Public Module GenderValidator
    Public Function IsGenderValid(ByVal gender As String, ByVal context As ValidationContext) As ValidationResult
        If gender = "M" OrElse gender = "m" OrElse gender = "F" OrElse gender = "f" Then
            Return ValidationResult.Success
        Else
            Return New ValidationResult("The Gender field only has two valid values 'M'/'F'", New String() {"Gender"})
        End If
    End Function
End Module
using System;
using System.ComponentModel.DataAnnotations;

namespace HRApp.Web
{
    public static class GenderValidator
    {
        public static ValidationResult IsGenderValid(string gender, ValidationContext context)
        {
            if (gender == "M" || gender == "m" || gender == "F" || gender == "f")
            {
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult("The Gender field only has two valid values 'M'/'F'", new string[] { "Gender" });
            }
        }
    }
}

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.

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 RoundtripOriginalAttribute markiert sind. 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.

Das Verhalten wird implementiert, indem das Attribut auf Eigenschaften in einer Metadatenklasse, auf die Metadatenklasse selbst oder, beim Arbeiten mit Entity Framework, auf alle Metadatenklassen angewendet wird. 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.

Transaktionen

Das RIA Services -Framework erstellt Transaktionen nicht automatisch, Sie können jedoch beim Senden von Änderungen explizite Transaktionen hinzufügen. Um eine eigene explizite Transaktion zu erstellen, überschreiben Sie die Submit-Methode. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen von expliziten Transaktionen zu einem Domänendienst.

Siehe auch

Konzepte

Sicherheit für WCF RIA Services