Gewusst wie: Hinzufügen von Metadatenklassen

In diesem Thema wird beschrieben, wie den server- und clientseitigen Entitäten mithilfe von Metadaten Funktionen hinzugefügt werden, indem Eigenschaften in einer Metadatenklasse mit Attributen ergänzt werden, durch die das Verhalten der Entitäten beeinflusst werden soll. WCF RIA Services bietet die Möglichkeit, Entitätsklassen und Eigenschaften mit Anmerkungen zu versehen. Anmerkungen werden mit partiellen Klassen implementiert, die als Metadatenklassen bezeichnet werden. Metadatenklassen werden verwendet, wenn Sie die generierten Entitätsklassen mit Anmerkungen versehen möchten und diese Anmerkungen beim erneuten Generieren der Entitätsklasse nicht verloren gehen sollen. Dies ermöglicht es Ihnen, Funktionen wie die Validierung und die Komposition von untergeordneten Entitäten hinzuzufügen. Eine Metadatenklasse wird mithilfe des MetadataTypeAttribute-Attributs angegeben.

Zum Hinzufügen von Metadatenklassen stehen zwei Methoden zur Auswahl. Wenn Sie eine neue DomainService-Klasse mit dem Assistenten Neue Domänendienstklasse hinzufügen hinzufügen, können Sie angeben, dass automatisch eine Metadatenklasse generiert werden soll, indem Sie Zugeordnete Klassen für Metadaten generieren aktivieren. Sie können eine Metadatenklasse auch manuell hinzufügen. In diesem Thema werden diese beiden Methoden zum Hinzufügen von Metadatenklassen beschrieben.

So fügen Sie eine Metadatenklasse mithilfe der Vorlage "Domänendienstklasse" hinzu

  1. Fügen Sie im Serverprojekt ein neues Element hinzu, und wählen Sie die Vorlage Domänendienstklasse aus.

  2. Wählen Sie im Dialogfeld Neue Domänendienstklasse hinzufügen die Entitäten aus, die im Domänendienst verfügbar gemacht werden sollen.

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

    RIA_ServicesMetadataClass

  4. Klicken Sie auf OK.

    Es wird eine Datei für die Domänendienstklasse und eine Datei für die Metadatenklasse generiert. Der Name der Metadatenklasse enthält .metadata (z. B. DomainService1.metadata.cs oder DomainService1.metadata.vb).

  5. Öffnen Sie die Metadatenklasse, und fügen Sie den Eigenschaften Attribute hinzu.

    Das folgende Beispiel zeigt eine Metadatenklasse, bei der 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; }
        }
    }
    

So fügen Sie eine Metadatenklasse manuell hinzu

  1. Fügen Sie im Serverprojekt eine neue Klassendatei mit dem gleichen Namen wie die Entitätsklasse hinzu, die Sie mit Anmerkungen versehen möchten. Schließen Sie gemäß der Konvention .metadata in den Dateinamen ein.

  2. Fügen Sie das partial-Schlüsselwort hinzu, um die Klasse als partielle Klasse festzulegen.

    Das folgende Beispiel zeigt eine partielle Klasse, die einer Entitätsklasse mit dem Namen Address entspricht.

    Partial Public Class Address
    End Class
    
    public partial class Address
    {
    }
    
  3. Erstellen Sie in der partiellen Klasse eine interne Klasse, die als Metadatenklasse dient.

    Das folgende Beispiel zeigt die interne Metadatenklasse.

    Partial Public Class Address
      Friend NotInheritable Class AddressMetadata
      End Class
    End Class
    
    public partial class Address
    {
      internal sealed class AddressMetadata
      {
      }
    }
    
  4. Fügen Sie der partiellen Klasse ein MetadataTypeAttribute-Attribut hinzu, und schließen Sie den Typ der Metadatenklasse ein.

    Im folgenden Beispiel wurde das MetadataTypeAttribute-Attribut auf die Klasse angewendet.

    <MetadataTypeAttribute(GetType(Address.AddressMetadata))> _
    Partial Public Class Address
      Friend NotInheritable Class AddressMetadata
      End Class
    End Class
    
    [MetadataTypeAttribute(typeof(Address.AddressMetadata))]
    public partial class Address
    {
      internal sealed class AddressMetadata
      {
      }
    }
    
  5. Fügen Sie in der Metadatenklasse Eigenschaften mit den gleichen Namen wie die Eigenschaften in der Entitätsklasse hinzu.

  6. Fügen Sie den Eigenschaften Attribute hinzu.

    Das folgende Beispiel zeigt eine Metadatenklasse, bei der 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; }
        }
    }