Exemplarische Vorgehensweise: Verwenden des Domänendiensts in ASP.NET-Anwendungen

WCF RIA Services

ASP.NET stellt ein DomainSourceControl-Steuerelement bereit, das von datengebundenen Steuerelementen wie dem GridView-Steuerelement verwendet werden kann, um auf die Datenbank zuzugreifen und dem Benutzer das Ausführen von Erstell-, Lese-, Aktualisierungs- und Löschvorgängen (CRUD) zu ermöglichen.

Wichtig ist hierbei, dass der Domänendienst Ihnen die Möglichkeit bietet, die Anwendung vom spezifischen Datenbankmodell zu trennen. Dies bietet Ihnen den Vorteil, dass Sie sich auf die Geschäftslogik und das Erstellen von leicht auf ein anderes Modell übertragbarem Code konzentrieren können.

Der WCF RIA Services-Domänendienst stellt ein Muster zum Schreiben von Anwendungslogik bereit, die auf dem Server ausgeführt wird und den Datenzugriff für Abfragen, Änderungen und benutzerdefinierte Vorgänge steuert. Er bietet durch die Integration von Silverlight-Client- und ASP.NET-Serveranwendungen auch End-to-End-Unterstützung für allgemeine Aufgaben wie Datenvalidierung, Authentifizierung und Rollen.

In dieser exemplarischen Vorgehensweise wird erläutert, wie Sie von einer ASP.NET-Webseite mithilfe des RIA Services -Domänendiensts auf eine Datenbank zugreifen. In dieser exemplarischen Vorgehensweise wird der Domänendienst in ASP.NET beschrieben, die Verwendung des Diensts ist jedoch nicht auf ASP.NET-Anwendungen beschränkt. Die Integration des ASP.NET-Servers in Silverlight-Clientanwendungen wird in dieser exemplarischen Vorgehensweise nicht behandelt.

Diese exemplarische Vorgehensweise umfasst folgende Verfahren:

Für diese und die anderen exemplarischen Vorgehensweisen in der RIA Services -Dokumentation müssen zusätzlich zu WCF RIA Services und dem WCF RIA Services-Toolkit mehrere erforderliche Programme installiert und korrekt konfiguriert werden, z. B. Visual Studio 2010, die Silverlight Developer-Laufzeit und das Silverlight-SDK. Zudem müssen Sie SQL Server 2008 R2 Express with Advanced Services installieren und konfigurieren und die AdventureWorks OLTP- und LT-Datenbanken installieren.

Ausführliche Anweisungen für jede dieser erforderlichen Komponenten finden Sie in den Themen unter Erforderliche Komponenten für WCF RIA Services. Folgen Sie den Anweisungen in diesen Themen, bevor Sie mit dieser exemplarischen Vorgehensweise fortfahren, um sicherzustellen, dass beim Ausführen der exemplarischen Vorgehensweisen für RIA Services so wenig Probleme wie möglich auftreten.

Zur Verwendung des Domänendiensts müssen Sie eine ASP.NET-Webanwendung erstellen, die mit einer Datenbank interagieren kann. Dazu müssen Sie die folgenden Schritte ausführen:

  • Erstellen einer Webanwendung. Dadurch wird die Umgebung für die Verwendung des Domänendiensts bereitgestellt.

  • Hinzufügen einer Datenbank zur Anwendung. Dies ermöglicht es Ihnen, die Datenbank für die Webanwendung auszuwählen.

  • Erstellen des Datenbankmodells. Sie erstellen das Modell, das die Datenbankentitäten in Form von CLR-Typen enthält. Dies sind die Typen, die der Domänendienst zur Interaktion mit der Datenbank verwendet. Sie können das ADO.NET Entity Framework- oder das LINQ to SQL-Datenmodell verwenden.

Im folgenden Verfahren wird beschrieben, wie eine ASP.NET-Webanwendung erstellt wird.

So erstellen Sie eine ASP.NET-Webanwendung

  1. Klicken Sie in Visual Studio 2010 auf das Menü Datei, klicken Sie auf Neu und dann auf Projekt.

    Das Dialogfeld Neues Projekt wird angezeigt.

  2. Erweitern Sie unter Installierte Vorlagen den Eintrag Visual C# bzw. Visual Basic, und wählen Sie dann Web aus.

  3. Wählen Sie in der Liste der Vorlagen den Eintrag Leere ASP.NET-Webanwendung aus.

  4. Geben Sie für das Projekt den Namen UsingDomainService ein, geben Sie einen Speicherort an, und klicken Sie dann auf OK.

  5. Erstellen Sie die Anwendung.

Im folgenden Verfahren wird beschrieben, wie der Anwendung eine Datenbank hinzugefügt wird. Diese Datenbank enthält die Tabelle, auf die zur Anzeige und Bearbeitung zugegriffen wird.

So fügen Sie der Webanwendung die Datenbank hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen, auf ASP.NET-Ordner hinzufügen und dann auf App_Data.

    Dadurch wird der Ordner "App_Data" dem Projekt hinzugefügt.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner "App_Data", klicken Sie auf Hinzufügen und dann auf Vorhandenes Element.

    Das Dialogfeld Vorhandenes Element hinzufügen wird angezeigt.

  3. Geben Sie den Speicherort für die AdventureWorksLT-Datenbankdatei (AdventureWorksLT_Data.mdf) an.

    Die folgende Abbildung zeigt das Dialogfeld Vorhandenes Element hinzufügen.

    ASP.NET-Domänendienstclient: Vorhandenes Element D hinzufügen
  4. Klicken Sie auf Hinzufügen.

    Dadurch wird eine Kopie der Datenbankdatei im Projekt erstellt. Weitere Informationen finden Sie unter Gewusst wie: Herstellen einer Verbindung mit der AdventureWorksLT-Datenbank mithilfe einer MDF-Datei.

Im folgenden Verfahren wird beschrieben, wie das Datenmodell erstellt wird, das die Klassen zur Darstellung der Datenbanktabellen enthält. In dieser exemplarischen Vorgehensweise verwenden Sie ein ADO.NET Entity Framework-Datenmodell. Sie könnten stattdessen jedoch auch ein LINQ to SQL-Datenmodell verwenden.

So erstellen Sie das Datenmodell

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen und dann auf Neues Element.

    Das Dialogfeld Neues Element hinzufügen wird angezeigt.

  2. Wählen Sie unter Installierte Vorlagen die Option Daten aus.

  3. Wählen Sie in der Liste der Vorlagen den Eintrag ADO.NET Entity Data Model aus.

  4. Geben Sie für das Datenbankmodell den Namen AdventureWorksLT.edmx ein, und klicken Sie dann auf Hinzufügen.

    Der Assistent für Entity Data Model wird angezeigt.

  5. Wählen Sie im Dialogfeld Modellinhalte auswählen die Option Aus Datenbank generieren aus.

    Die folgende Abbildung zeigt das Dialogfeld Modellinhalte auswählen.

    ASP.NET-Domänendienstclient: Modellinhalt auswählen
  6. Klicken Sie auf Weiter.

  7. Wählen Sie im Dialogfeld Wählen Sie Ihre Datenverbindung aus in der Dropdownliste unter Über welche Datenverbindung soll die Anwendung eine Verbindung mit der Datenbank herstellen? die Datei "AdventureWorksLT_Data.mdf" aus.

  8. Vergewissern Sie sich, dass das Kontrollkästchen Die Entitätsverbindungseinstellungen in Web.Config speichern als aktiviert ist. Sie können den Standard-Verbindungszeichenfolgennamen übernehmen.

    Die folgende Abbildung zeigt das Dialogfeld Wählen Sie Ihre Datenverbindung aus.

    ASP.NET-Domänendienstclient: Datenverbindung auswählen
  9. Klicken Sie auf Weiter.

    Im Assistenten wird eine Seite angezeigt, auf der Sie die in das Modell einzuschließenden Datenbankobjekte angeben können.

  10. Wählen Sie im Dialogfeld Wählen Sie Ihre Datenbankobjekte aus den Knoten Tabellen aus, um alle Tabellen aus der Datenbank auszuwählen.

    Die folgende Abbildung zeigt das Dialogfeld Wählen Sie Ihre Datenbankobjekte aus.

    ASP.NET-Domänendienstclient: Datenbank auswählen
  11. Vergewissern Sie sich, dass das Kontrollkästchen Fremdschlüsselspalten in das Modell einbeziehen aktiviert ist. Sie können den Standardmodellnamespace übernehmen.

  12. Klicken Sie auf Fertig stellen.

    Der ADO.NET Entity Data Model Designer wird angezeigt. Sie haben das Datenmodell erstellt, das die AdventureWorksLT-Datenbank darstellt.

  13. Schließen Sie den Designer.

  14. Erstellen Sie die Anwendung.

    Durch das Erstellen wird die AdventureWorksLT_DataEntities-Kontextklasse für den Domänendienst im nächsten Verfahren verfügbar gemacht.

In diesem Verfahren werden die erforderlichen Schritte zum Verwenden des Domänendiensts in einer ASP.NET-Anwendung beschrieben. Folgende Schritte müssen ausgeführt werden:

  • Hinzufügen einer Domänendienstklasse zum Projekt. Dadurch wird die Klasse erstellt, die der Anwendung das Ausführen von CRUD-Datenbankvorgängen ermöglicht, und – was besonders wichtig ist – können Sie Ihre Geschäftslogik einschließen. Diese Klasse wird auf dem Server oder der mittleren Ebene ausgeführt.

  • Erstellen der Geschäftslogik. Sie schließen den Code (Geschäftslogik) in die Domänendienstklasse ein.

  • Deklarieren des DomainDataSource-Steuerelements. Das Steuerelement wird in einem Seitenmarkup deklariert, damit der Benutzer mit der Datenbank interagieren kann. Dieses Steuerelement wird auf dem Client oder der Präsentationsebene ausgeführt.

Im folgenden Verfahren wird beschrieben, wie der Domänendatendienst dem Projekt hinzugefügt wird.

So fügen Sie die Domänendienstklasse dem Projekt hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen und dann auf Neues Element.

  2. Wählen Sie unter Installierte Vorlagen den Eintrag Web aus.

  3. Wählen Sie in der Liste der Vorlagen den Eintrag Domänendienstklasse aus.

  4. Geben Sie für die Datei den Namen AdventureWorksDomainService.cs bzw. AdventureWorksDomainService.vb ein, und klicken Sie dann auf Hinzufügen.

    Das Dialogfeld Neue Domänendienstklasse hinzufügen wird angezeigt. Das Feld Name der Domänendienstklasse enthält den von Ihnen angegebenen Namen.

  5. Aktivieren Sie das Kontrollkästchen Clientzugriff aktivieren.

  6. Wählen Sie in der Dropdownliste Verfügbare DataContexts/ObjectContexts den Eintrag AdventureWorksLT_DataEntities (Entity Framework) aus. Wenn die Dropdownliste leer ist, haben Sie die Anwendung nicht erstellt. Schließen Sie das Dialogfeld Neue Domänendienstklasse hinzufügen, erstellen Sie die Anwendung, und wiederholen Sie die obigen Schritte. 

  7. Wählen Sie in der Liste Entitäten die Tabelle Product aus.

  8. Aktivieren Sie für die Tabelle Product das Kontrollkästchen Bearbeitung aktivieren.

  9. Aktivieren Sie das Kontrollkästchen Zugeordnete Klassen für Metadaten generieren.

    Die folgende Abbildung zeigt das Dialogfeld Neue Domänendienstklasse hinzufügen.

    ASP.NET-Domänendienstclient: Neue Domänendienstklasse hinzufügen
  10. Klicken Sie auf OK.

    Die AdventureWorksDomainService-Klasse und die zugehörige Metadatendatei werden erstellt. Die Klasse enthält die Methoden, die CRUD-Datenbankvorgänge ermöglichen. Sie können sowohl die Klasse als auch die Metadatendateien ändern, um die Geschäftslogik einzuschließen. Im nächsten Verfahren wird ein einfaches Beispiel gezeigt. Beachten Sie, dass die Projektverweise mit den erforderlichen Assemblys aktualisiert wurden und die Datei "Web.config" mit allen benötigten Konfigurationselementen aktualisiert wurde.

  11. Klicken Sie im Menü Datei auf Alle speichern.

Im folgenden Verfahren wird beschrieben, wie die AdventureWorksDomainService-Klasse und die zugehörige Metadatendatei angepasst werden, um die Geschäftslogik einzuschließen. Die Anpassung ist sehr einfach, gibt Ihnen jedoch eine Vorstellung davon, welche Änderungen möglich sind.

So erstellen Sie die Geschäftslogik

  1. Öffnen Sie im Projektmappen-Explorer die Datei "AdventureWorksDomainService.cs" bzw. "AdventureWorksDomainService.vb".

  2. Ändern Sie die UpdateProduct-Methode, um wie im folgenden Code gezeigt Validierungslogik für das ListPrice-Feld hinzuzufügen. Aktualisieren Sie außerdem das ModifiedDate-Feld mit dem aktuellen Datum.

    public void UpdateProduct(Product currentProduct)
    {
      if ((currentProduct.EntityState == EntityState.Detached))
      {
        // Custom logic: set a lower limit for the price.
        if (currentProduct.ListPrice < 5)
          throw new ValidationException("The list price must be >= 5.");
        this.ObjectContext.Products.AttachAsModified(currentProduct,
           this.ChangeSet.GetOriginal(currentProduct));
        // Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today;
      }
    }
    

    Public Sub UpdateProduct(ByVal currentProduct As Product)
      If (currentProduct.EntityState = EntityState.Detached) Then
        ' Custom logic: set a lower limit for the price.
        If currentProduct.ListPrice < 5 Then
          Throw New ValidationException("The list price must be >= 5.")
        End If
        Me.ObjectContext.Products.AttachAsModified(currentProduct, _
          Me.ChangeSet.GetOriginal(currentProduct))
        ' Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today
      End If
    End Sub
    

    Wenn die Validierung fehlschlägt, wird eine Ausnahme ausgelöst, und eine für den Benutzer anzuzeigende Fehlermeldung wird an die Seite gesendet.

  3. Ändern Sie die GetProducts-Methode wie im folgenden Code gezeigt, um die Sortierlogik für das Entity Framework korrekt festzulegen.

    public IQueryable<Product> GetProducts()
    {
      return this.ObjectContext.Products.OrderBy(p => p.ProductID);
    } 
    

    Public Function GetProducts() As IQueryable(Of Product)
      Return Me.ObjectContext.Products.OrderBy(Function(p) p.ProductID)
    End Function
    
  4. Speichern und schließen Sie die Datei.

  5. Öffnen Sie im Projektmappen-Explorer die Datei "AdventureWorksDomainService.metadata.cs" bzw. "AdventureWorksDomainService.metadata.vb".

  6. Fügen Sie der Color-Datenfeldentität wie im folgenden Code gezeigt das Required-Attribut hinzu.

    Mit diesem Attribut erzwingen Sie, dass das Datenfeld anders als in der Datenbank zulässig nicht leer sein darf. Wenn der Benutzer eine leere Zeichenfolge eingibt, wird ein Fehler ausgegeben.

    [Required(AllowEmptyStrings=false, 
      ErrorMessage="Color is required")]
    public string Color{ get; set; }
    

    <Required(AllowEmptyStrings:=False, ErrorMessage:="Color is required")> _
    Public Property Color As String
    
  7. Speichern und schließen Sie die Metadatendatei.

  8. Erstellen Sie die Anwendung.

Im folgenden Verfahren wird beschrieben, wie das DomainDataSource-Steuerelement in einem Seitenmarkup deklariert wird, damit der Benutzer mit der Datenbank interagieren kann.

So deklarieren Sie das DomainDataSource-Steuerelement in einer Seite

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen und dann auf Neues Element.

  2. Klicken Sie unter Installierte Vorlagen auf Web.

  3. Wählen Sie in der Liste der Vorlagen den Eintrag Web Form aus.

  4. Geben Sie für die Datei den Namen Default.aspx ein, und klicken Sie dann auf Hinzufügen.

  5. Öffnen Sie "Default.aspx" in der Entwurfsansicht.

  6. Fügen Sie der Seite aus der Gruppe Allgemein oder Daten der Toolbox ein DomainDataSource-Steuerelement hinzu.

    Die DomainDataSource wird mit geöffnetem Menü DomainDataSource-Aufgaben angezeigt.

    Wenn das Steuerelement nicht aufgeführt ist, klicken Sie auf das Menü Extras und dann auf Toolboxelemente auswählen. Klicken Sie im Dialogfeld Toolboxelemente auswählen auf die Registerkarte .NET Framework-Komponenten, aktivieren Sie das Kontrollkästchen DomainDataSource, und klicken Sie dann auf OK.

  7. Klicken Sie im Menü DomainDataSource-Aufgaben auf Datenquelle konfigurieren.

    Der Assistent Datenquelle konfigurieren wird angezeigt.

  8. Wählen Sie im Dialogfeld Domänendienst auswählen in der Liste Domänendiensttyp die Klasse aus, die Sie erstellt haben (UsingDomainService.AdventureWorksDomainService).

    Die folgende Abbildung zeigt das Dialogfeld Domänendienst auswählen.

    ASP.NET-Domänendienstclient: Domänendienst auswählen
  9. Klicken Sie auf Weiter.

  10. Wählen Sie im Dialogfeld Datenzugriff konfigurieren die IQueryable<Product> GetProducts()-Methode aus.

  11. Aktivieren Sie die Kontrollkästchen Einfügen aktivieren, Aktualisieren aktivieren und Löschen aktivieren.

    Die folgende Abbildung zeigt das Dialogfeld Datenzugriff konfigurieren.

    ASP.NET-Domänendienstclient: Domänenzugriff auswählen
  12. Klicken Sie auf Fertig stellen.

  13. Fügen Sie der Seite auf der Registerkarte Daten der Toolbox ein GridView-Steuerelement hinzu.

    Die GridView wird mit geöffnetem Menü GridView-Aufgaben angezeigt.

  14. Wählen Sie im Menü GridView-Aufgaben in der Liste Datenquelle auswählen den Eintrag DomainDataSource1 aus.

    Dies ist die ID des DomainDataSource-Steuerelements, das Sie in den obigen Schritten erstellt haben.

  15. Klicken Sie im Menü GridView-Aufgaben auf Spalten bearbeiten.

    Das Dialogfeld Felder wird angezeigt.

  16. Deaktivieren Sie das Kontrollkästchen Felder automatisch generieren.

  17. Löschen Sie im Bereich Ausgewählte Felder alle Felder außer Name, Color, ListPrice und ModifiedDate.

  18. Klicken Sie auf OK.

  19. Aktivieren Sie ggf. im Menü GridView-Aufgaben Paging, Sortierung und Auswahl, indem Sie die entsprechenden Kontrollkästchen aktivieren.

  20. Speichern Sie die Datei, und wechseln Sie zur Quellansicht.

  21. Wählen Sie das GridView-Steuerelement aus.

  22. Legen Sie im Eigenschaftenfenster die DataKeyNames-Eigenschaft auf die folgende durch Trennzeichen getrennte Liste aller Spalten fest, die nicht angezeigt werden: ProductID, ProductNumber, StandardCost, Size, Weight, ProductCategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, ThumbNailPhotoFileName, rowguid.

    Diese Einstellung ist erforderlich, damit das DomainDataSource-Steuerelement die CRUD-Vorgänge ausführen kann.

  23. Legen Sie die AutoGenerateEditButton-Eigenschaft auf True fest, um das Bearbeiten und Löschen von Tabellenzeilen zu ermöglichen.

  24. Ersetzen Sie in der Quellansicht das Columns-Element durch das folgende Markup.

    Dieses Markup ermöglicht durch benutzerdefinierte Vorlagen die Validierung der Color- und ListPrice-Datenfeldwerte, bevor sie beim Postback an den Server gesendet werden. Zudem wird ein LinkButton-Steuerelement für das Löschen erstellt, durch das der Benutzer vor dem Löschen einer Zeile zur Bestätigung aufgefordert wird.

      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Delete" Text="Delete"
              ForeColor="#333333"  OnClientClick='return confirm("Are you sure you want to delete this row?");'/>
          </ItemTemplate>
        </asp:TemplateField>
    
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:TemplateField>
          <HeaderTemplate>Color</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("Color") %>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ColorID" runat="server" Text='<%# Bind("Color") %>'/>
            <cc1:DomainValidator ID="DomainValidator2"  runat="server" DataField="Color"/>
          </EditItemTemplate>
        </asp:TemplateField>
    
        <asp:TemplateField>
          <HeaderTemplate>ListPrice</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("ListPrice")%>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ListPriceID" runat="server" Text='<%# Bind("ListPrice") %>'/>
            <cc1:DomainValidator ID="DomainValidator3" runat="server" DataField="ListPrice"/>
           </EditItemTemplate>
         </asp:TemplateField>
    
         <asp:BoundField DataField="ModifiedDate" HeaderText="ModifiedDate" SortExpression="ModifiedDate" />
      </Columns>
    
  25. Fügen Sie vor dem GridView-Steuerelement das folgende Markup hinzu, um die Anzeige von Validierungsfehlern zu ermöglichen:

    <asp:ValidationSummary ID="ValidationSummary1" runat="server" />
    <cc1:DomainValidator runat="server" ControlToValidate="GridView1"/>
    
  26. Speichern Sie die Datei "Default.aspx".

  27. Erstellen Sie die Anwendung.

In diesem Verfahren wird beschrieben, wie Sie die Domänendienstfunktionen mithilfe des GridView-Steuerelements testen. Bei diesem Verfahren wird Folgendes überprüft:

  • Die Interaktion mit der Datenbank mit der benutzerdefinierten Geschäftslogik funktioniert wie erwartet.

  • ASP.NET führt die Änderungen aus, die vom Benutzer an den Datenbankfeldern vorgenommen wurden.

  • ASP.NET zeigt die von der benutzerdefinierten Logik generierten Fehlermeldungen an.

Testen des Domänendiensts

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Seite "Default.aspx", und wählen Sie dann In Browser anzeigen aus.

    Im Browser wird eine Seite mit der Tabelle "Product" angezeigt.

  2. Klicken Sie in einer Zeile auf Bearbeiten, und ändern Sie den Wert der Spalte "ListPrice", indem Sie einen Wert kleiner 5 eingeben.

  3. Klicken Sie in derselben Zeile auf Aktualisieren.

    Ein benutzerdefinierter Fehler mit dem Hinweis, dass der Feldwert größer oder gleich 5 sein muss, wird angezeigt.

  4. Geben Sie in derselben Zeile einen Wert größer 5 für die Spalte "ListPrice" ein.

  5. Klicken Sie in derselben Zeile auf Aktualisieren.

    ASP.NET aktualisiert die Datenfelder "ListPrice" und "ModifiedDate" in der Datenbank.

  6. Klicken Sie in einer Zeile auf Bearbeiten, und ändern Sie den Wert der Spalte "Color", indem Sie eine leere Zeichenfolge eingeben.

  7. Klicken Sie in derselben Zeile auf Aktualisieren.

    ASP.NET zeigt einen benutzerdefinierten Validierungsfehler an.

  8. Geben Sie in derselben Zeile einen Wert für die Spalte "Color" ein, bei dem es sich nicht um eine leere Zeichenfolge handelt.

  9. Klicken Sie in derselben Zeile auf Aktualisieren.

    ASP.NET aktualisiert die Datenfelder "Color" und "ModifiedDate" in der Datenbank.

Anzeigen: