Schéma conceptuel Northwind (EDM)
Les entités et les associations EDM (Modèle de données d'entité) sont les caractéristiques formelles des objets programmables dans le code d'application. Avec ou sans données existantes, les entités et les associations sont déclarées dans la syntaxe CSDL (Conceptual Schema Definition Language). L'écriture d'un schéma dans CSDL est généralement la première étape dans la conception d'une application basée sur le modèle EDM.
L'application EDM illustrée ici et dans les rubriques voisines utilise les données existantes dans l'exemple de base de données Northwind, si bien que le modèle de stockage est déjà implémenté. L'utilisation des données dans cette application requiert votre attention sur la structure des tables existantes lorsque vous définissez les types d'entité et les associations dans le domaine de l'application.
L'implémentation inclut des caractéristiques conceptuelles, des métadonnées de stockage, une spécification de mappage et un code d'application en utilisant le modèle objet créé à partir des schémas et des spécifications de mappage.
Quatre entités et deux associations sont définies par l'exemple de schéma illustré dans cette section. Les types d'entité définis sont dérivés des schémas de classe de base installés avec ADO.NET. Pour obtenir une vue d'ensemble des schémas et du mappage, voir Schémas et spécification de mappage (Entity Framework).
Dans l'exemple suivant, la balise <Schema> d'ouverture contient une déclaration de l'espace de noms qui est défini : NorthwindLib. L'espace de noms a un alias, Self, qui est utilisé comme identificateur court dans le corps du schéma. Les URL dans la balise <Schema> d'ouverture sont les mêmes dans toutes les applications EDM.
Les balises <Documentation> incluent des informations utiles aux développeurs. Le texte entre les balises de documentation est plus qu'un simple commentaire de code ; une fois la bibliothèque d'objets créée, les informations apparaissent dans l'Explorateur d'objets dans Visual Studio et dans les autres outils utilisés pour parcourir les classes. Dans cet exemple, le texte identifie le schéma défini dans ce fichier XML.
Dans cet exemple, trois entités sont définies dans les balises <EntityType>. Chaque entité inclut un attribut Key qui indique la propriété de l'entité qui est l'identificateur unique pour les instances de ce type. Deux types <Association> sont spécifiés par les propriétés Name et End Role qui fournissent une étendue pour les types liés par les associations. Dans cet exemple, une association et une propriété de navigation connectent des instances de l'entité Product avec des entités Category auxquelles elles sont liées de manière logique. Une autre association connecte des instances Order avec les instances de Customers qui passent les commandes. Pour plus d'informations sur les associations, voir Relations du modèle Entity Data Model.
<?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>
Les balises les plus fréquemment utilisées dans ce schéma sont les balises <Property>. Des propriétés spécifient les différents types de données que chaque <EntityType> contient. Par exemple, les propriétés d'un Product incluent les propriétés suivantes : ProductID, ProductName, UnitPrice et le NavigationProperty nommé Category qui lie ce produit à un ensemble de produits semblables. Ce groupe de propriétés définit l'entité Product.
Les balises EDM <EntityContainer> spécifient un conteneur qui sera mappé à un objet de base de données (dbo) dans le schéma des métadonnées de stockage. Ce <EntityContainer> contient trois spécifications <EntitySet> et deux spécifications <AssociationSet>.
Pour plus d'informations sur la syntaxe XML utilisée dans ce fichier CSDL, voir Schémas (EDM). Pour plus d'informations sur les propriétés de navigation, voir Implémentation d'associations (EDM).
Voir aussi
Concepts
Types de modèles EDM
Relations du modèle Entity Data Model
Schémas (EDM)
Implémentation d'associations (EDM)