Share via


Konzeptionelles Schema für Northwind (EDM)

Entitätsdatenmodell (EDM)-Entitäten und -Zuordnungen sind die formalen Spezifikationen für programmierbare Objekte in Anwendungscode. Mit oder ohne vorhandene Daten werden Entitäten und Zuordnungen in CSDL-Syntax deklariert. Der erste Schritt des Entwurfs einer auf dem EDM aufbauenden Anwendung ist in der Regel das Schreiben eines Schemas in CSDL.

Für die in diesem und den verwandten Themen beschriebene EDM-Anwendung werden die in der Beispieldatenbank Northwind vorhandenen Daten verwendet. Das Speichermodell ist daher bereits implementiert. Wenn die Daten in dieser Anwendung verwendet werden sollen, muss beim Definieren der Entitätstypen und Zuordnungen in der Anwendungsdomäne auf die Struktur der vorhandenen Tabellen geachtet werden.

Zur Implementierung gehören konzeptionelle Spezifikationen, Speichermetadaten, eine Mappingspezifikation und Anwendungscode. Dabei wird das auf den Schemas und den Mappingspezifikationen beruhende Objektmodell verwendet.

Im Schemabeispiel in diesem Abschnitt werden vier Entitäten und zwei Zuordnungen definiert. Die definierten Entitätstypen werden von den mit ADO.NET installierten Basisklassenschemas abgeleitet. Eine Übersicht über die Schemas und Zuordnungen finden Sie unter Schemas und Mappingspezifikation (Entity Framework).

Im folgenden Beispiel enthält das Starttag <Schema> eine Deklaration des definierten Namespace: NorthwindLib. Der Namespace verfügt über den Alias Self, der im Hauptteil des Schemas als Kurzbezeichner verwendet wird. Die URLs im Starttag <Schema> sind für alle EDM-Anwendungen identisch.

<Documentation>-Tags enthalten Informationen, die für Entwickler nützlich sind. Beim Text zwischen den Dokumentationstags handelt es sich um mehr als einen Codekommentar. Nach dem Erstellen der Objektbibliothek werden die Informationen in Visual Studio und anderen Tools zum Durchsuchen von Klassen im Objektbrowser angezeigt. In diesem Beispiel identifiziert der Text das in dieser XML-Datei definierte Schema.

In diesem Beispiel werden drei Entitäten innerhalb von <EntityType>-Tags definiert. Jede Entität beinhaltet ein Key-Attribut, das die Eigenschaft der Entität bezeichnet, die den eindeutigen Bezeichner für Instanzen dieses Typs darstellt. Zwei <Association>-Typen werden mithilfe der Name-Eigenschaft und der End Role-Eigenschaft angegeben, die den Bereich der durch die Zuordnungen verknüpften Typen bereitstellen. In diesem Beispiel verbindet eine Zuordnung und eine Navigationseigenschaft die Instanzen der Product-Entität mit Category-Entitäten, mit denen sie logisch verknüpft sind. Eine weitere Zuordnung verbindet Order-Instanzen mit Instanzen von Customers, die die Bestellungen aufgeben. Weitere Informationen über Zuordnungen finden Sie unter Entity Data Model-Beziehungen.

<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns:cg=https://schemas.microsoft.com/ado/2006/04/codegeneration
 xmlns:edm=https://schemas.microsoft.com/ado/2006/04/edm
 xmlns=https://schemas.microsoft.com/ado/2006/04/edm
 Namespace="NorthwindLib" Alias="Self">

  <EntityType Name="Product">
    <Key>
      <PropertyRef Name="ProductID" />
    </Key>
    <Property Name="ProductID" Type="Int32" Nullable="false" />
    <Property Name="ProductName" Type="String" 
                Nullable="false" ConcurrencyMode="Fixed" />
    <Property Name="UnitPrice" Type="Decimal" 
                Nullable="true" ConcurrencyMode="Fixed" />
    <NavigationProperty Name="Category"
          Relationship="Self.Category_Product" FromRole="Product"
          ToRole="Category" />
  </EntityType>

  <EntityType Name="DiscontinuedProduct" BaseType="Self.Product">
    <!-- Units in stock for discontinued products. -->
    <Property Name="UnitsInStock" Type="Int16" Nullable="true" />
  </EntityType>

  <EntityType Name="Customer">
    <Key>
      <PropertyRef Name="CustomerID" />
    </Key>
    <Property Name="CustomerID" Type="String" Nullable="false" />
    <Property Name="CompanyName" Type="String"
              Nullable="false" ConcurrencyMode="Fixed" />
    <Property Name="ContactName" Type="String"
              Nullable="true" ConcurrencyMode="Fixed" />
    <Property Name="City" Type="String"
              Nullable="true" ConcurrencyMode="Fixed" />
    <Property Name="Country" Type="String"
              Nullable="true" ConcurrencyMode="Fixed" />
    <NavigationProperty Name="SalesOrders"
            Relationship="Self.Customer_Order" FromRole="Customer"
            ToRole="SalesOrder" />
  </EntityType>

  <EntityType Name="Category">
    <Key>
      <PropertyRef Name="CategoryID" />
    </Key>
    <Property Name="CategoryID" Type="Int32" Nullable="false" />
    <Property Name="CategoryName" Type="String"
                  Nullable="false" ConcurrencyMode="Fixed" />
    <Property Name="Description" Type="String" Nullable="true" />
    <NavigationProperty Name="Products"
        Relationship="Self.Category_Product"
        FromRole="Category" ToRole="Product" />
  </EntityType>

  <EntityType Name="SalesOrder">
    <Key>
      <PropertyRef Name="OrderID" />
    </Key>
    <Property Name="OrderID" Type="Int32" Nullable="false" />
    <Property Name="OrderDate" Type="DateTime" Nullable="true" />
    <Property Name="ShipCity" Type="String" Nullable="true" />
    <Property Name="ShipCountry" Type="String" Nullable="true" />
    <NavigationProperty Name="Customer"
       Relationship="Self.Customer_Order"
       FromRole="SalesOrder" ToRole="Customer" />
  </EntityType>

  <Association Name="Customer_Order">
    <End Role="Customer" Type="Self.Customer" Multiplicity="1" />
    <End Role="SalesOrder" Type="Self.SalesOrder" Multiplicity="*" />
  </Association>

  <Association Name="Category_Product">
    <End Role="Category" Type="Self.Category" Multiplicity="1" />
    <End Role="Product" Type="Self.Product" Multiplicity="*" />
  </Association>

  <EntityContainer Name="Northwind">
    <EntitySet Name="Categories" EntityType="Self.Category" />
    <EntitySet Name="Products" EntityType="Self.Product" />
    <EntitySet Name="Customers" EntityType="Self.Customer" />
    <EntitySet Name="SalesOrders" EntityType="Self.SalesOrder" />
    <AssociationSet Name="CustomerOrders"
                  Association="Self.Customer_Order">
      <End Role="Customer" EntitySet="Customers" />
      <End Role="SalesOrder" EntitySet="SalesOrders" />
    </AssociationSet>
    <AssociationSet Name="CategoryProducts"
                  Association="Self.Category_Product">
      <End Role="Category" EntitySet="Categories" />
      <End Role="Product" EntitySet="Products" />
    </AssociationSet>
  </EntityContainer>

</Schema>

Die am häufigsten verwendeten Tags in diesem Schema sind <Property>-Tags. Eigenschaften geben die verschiedenen Arten von Daten an, die jeder <EntityType> enthält. So enthalten beispielsweise die Eigenschaften eines Product folgende Eigenschaften: ProductID, ProductName, UnitPrice und die als Category benannte NavigationProperty, die dieses Produkt mit ähnlichen Produkten verbindet. Diese Gruppe von Eigenschaften definiert die Entität Product.

EDM-<EntityContainer>-Tags geben einen Container an, der einem Datenbankobjekt (dbo) im Speichermetadatenschema zugeordnet wird. Dieser <EntityContainer> verfügt über drei <EntitySet>-Spezifikationen und zwei <AssociationSet>-Spezifikationen.

Weitere Informationen zu der in dieser CSDL-Datei verwendeten XML-Syntax finden Sie unter Schemas (EDM). Informationen über Navigationseigenschaften finden Sie unter Implementieren von Zuordnungen (EDM).

Siehe auch

Konzepte

Entity Data Model-Typen
Entity Data Model-Beziehungen
Schemas (EDM)
Implementieren von Zuordnungen (EDM)

Weitere Ressourcen

Schemas und Mappingspezifikation (Entity Framework)