Schémas (EDM)
Un schéma EDM (Modèle de données d'entité) est un fichier texte XML qui décrit les types d'entités et de relations. Le schéma définit également un conteneur dans lequel les instances de ces types sont organisées de façon logique. Les entités et les associations du modèle EDM définissent les types de base installés avec Entity Framework et les types conçus par des développeurs.
Une structure de schéma est écrite en CSDL (Conceptual Schema Definition Language). Un second schéma écrit en SSDL (Store Schema Definition Language) définit le modèle de stockage d'une application qui utilise le modèle EDM.
Cette rubrique décrit les structures de schéma écrites en CSDL. Pour plus d'informations sur les métadonnées de stockage et les schémas de mappage, voir Schémas et spécification de mappage (Entity Framework).
L'élément de niveau supérieur d'un schéma attribue un espace de noms dans lequel des règles d'unicité des noms s'appliquent. Les types définis dans le schéma abrégé suivant sont organisés de façon logique sous l'espace de noms MyCompany.LOBSchema
. Cet espace de noms ressemble à un espace de noms de la programmation orientée objet qui contient des classes et des procédures de code. Le modèle EDM ne définit pas de procédures. Pour plus d'informations sur l'implémentation de procédures, voir Méthodes d'assistance (EDM).
Chaque entité et association définie dans le schéma ci-dessous a un nom complet, tel que MyCompany.LOBSchema.Customer
. Les noms complets sont abrégés dans l'exemple par l'alias Self
déclaré pour l'espace de noms MyCompany.LOBSchema
, comme dans l'utilisation Self.Customer
.
Les entités et associations sont définies dans le corps du schéma. Les propriétés des entités définies dans cet exemple sont omises pour présenter la structure d'ensemble d'un schéma CSDL.
<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns="https://schemas.microsoft.com/ado/2006/04/edm"
Namespace="MyCompany.LOBSchema" Alias="Self">
<Documentation>
<Summary>Conceptual schema (csdl)</Summary>
<LongDescription>This schema is an example showing
general syntax.</LongDescription>
</Documentation>
<EntityType Name="Customer">
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Name="CustomerId" Type="Guid" Nullable="false" />
<!-- Other properties-->
</EntityType>
<EntityType Name="Order">
<Key>
<PropertyRef Name="OrderId" />
</Key>
<Property Name="OrderId" Type="Guid" Nullable="false" />
<!-- Other properties-->
</EntityType>
<Association Name="Customer_Order">
<End Role="Customer" Type="Self.Customer" Multiplicity="0..1" />
<End Role="Order" Type="Self.Order" Multiplicity="*" />
</Association>
<EntityContainer Name="LOBSchemaData">
<EntitySet Name="Customers" EntityType="Self.Customer" />
<EntitySet Name="Orders" EntityType="Self.Order" />
<AssociationSet Name="Customer_Orders" Association="Self.Customer_Order">
<End Role="Customer" EntitySet="Customers" />
<End Role="Order" EntitySet="Orders" />
</AssociationSet>
</EntityContainer>
</Schema>
Un alias d'un schéma défini dans un autre fichier CSDL peut être défini avec la balise Using, de sorte que les types existants des schémas externes peuvent être utilisés dans l'espace de noms en cours de définition sans syntaxe complète.
Dans les schémas complets, les déclarations d'entité incluent des propriétés. L'une des propriétés est désignée par la propriété Key. L'attribut Key d'un élément EntityType spécifie une ou plusieurs propriétés de l'entité en tant que clé (Key). La valeur Key peut être un composite de plusieurs propriétés. La valeur Key identifie de façon unique les instances d'une entité pour toutes les opérations.
À l'intérieur de la balise d'ouverture EntityType de l'exemple ci-dessous, après l'attribution de l'attribut Name pour l'entité, CustomerId
est attribué à l'attribut Key. Guid est attribué à l'attribut Type de la propriété KeyCustomerId
pour spécifier une valeur unique pour l'élément Key. La déclaration de la propriété CustomerId
figure ensuite sur la deuxième ligne de ce segment CSDL.
<EntityType Name="Customer" >
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Name="CustomerId" Type="Guid" Nullable="false" />
<Property Name="Title" Type="String" Nullable="false" />
</EntityType>
La dernière ligne de l'exemple déclare une propriété nommée Title
et attribue String à l'élément Type de la propriété Title
. La propriété Title
identifie la fonction principale du client. La propriété Title
ne peut pas avoir la valeur Null
, tel que l'indique la contrainte Nullability="false"
. L'attribut Default du type String de la propriété Title
a la valeur "NewHire"
.
Une clé composite peut être spécifiée comme indiqué dans l'exemple suivant.
<EntityType Name="EmployeePayHistory">
<Key>
<PropertyRef Name="EmployeeID" />
<PropertyRef Name="RateChangeDate" />
</Key>
<Property Name="EmployeeID" Type="Int32" Nullable="false" />
<Property Name="RateChangeDate" Type="DateTime" Nullable="false"/>
<Property Name="Rate" Type="Decimal" Nullable="false"/>
<Property Name="PayFrequency" Type="Boolean" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
<NavigationProperty Name="Employee"
Relationship="Adventureworks.FK_EmployeePayHistory_Employee_EmployeeID"
FromRole="EmployeePayHistory" ToRole="Employee" />
</EntityType>
Conteneur d'entités
Les schémas qui utilisent le modèle EDM définissent un conteneur d'entités pour spécifier les ensembles de types de données qui seront disponibles dans l'espace de noms en cours de définition. Le conteneur d'entités est la base de l'espace de noms dans le modèle objet programmable qui sera créé à partir du schéma CSDL.
Dans la hiérarchie XML, l'élément EntityContainer est indépendant de l'élément Schema, même si EntityContainer est défini dans un schéma. Cela est important lors du mappage du EntityContainer au stockage. Les balisesEntityContainer du schéma conceptuel sont mappées aux balises EntityContainer correspondantes dans les métadonnées de stockage. Notez que, dans le fichier de mappage, le nom complet de l'élément EntityContainer n'inclut pas le nom de l'espace de noms du schéma.
Les jeux d'entités modèlent les classes du modèle objet programmable. Les ensembles d'associations définissent la portée des relations. Pour plus d'informations sur les jeux d'entités et les ensembles d'associations, voir Jeux d'entités (EDM) et Ensemble d'associations (EDM).
Le segment de schéma ci-dessous contient la déclaration EntityContainer de l'espace de noms LOBSchemaData
dans l'espace de noms MyCompany.LOBSchema
.
<EntityContainer Name="LOBSchemaData">
<EntitySet Name="Customers" EntityType="Self.Customer"/>
<EntitySet Name="Orders" EntityType="Self.Order"/>
<AssociationSet Name="Customer_Orders"
Association="Self.Customer_Order">
<End Role="Customer" EntitySet="Customers"/>
<End Role="Order" EntitySet="Orders"/>
</AssociationSet>
</EntityContainer>
La déclaration EntityContainer inclut toutes les entités et associations définies dans les segments de code précédents, maintenant sous la forme de jeux spécifiés par les balises EntitySet et AssociationSet.
Lorsque les spécifications de ce schéma sont implémentées en tant que types de données, chaque instance d'une entité Customer
ou Order
sera membre du jeu d'entité EntitySet approprié. Ce conteneur d'entités définit des jeux d'entités Customer
et Order
nommés sous leur forme plurielle : Customers
et Orders
. Les développeurs peuvent définir leurs propres conventions d'affectation de noms. Pour plus d'informations sur la façon dont les noms correspondent à ceux spécifiés dans les métadonnées de stockage et la spécification de mappage, voir Schémas et spécification de mappage (Entity Framework).
Les balises AssociationSet de la déclaration EntityContainer précédente spécifient un ensemble d'associations nommé Customer_Orders
. Cet ensemble d'associations contient des instances de l'association Customer_Order
.
Ces éléments (EntityType, EntitySet, Association, AssociationSet et EntityContainer) sont combinés pour constituer la structure de base d'un schéma. Pour plus d'informations ligne par ligne sur les déclarations stipulées dans les schémas, voir Schémas et spécification de mappage (Entity Framework).
Déploiement
La spécification EDM ne détermine pas le modèle de stockage utilisé après la définition des types d'entités en CSDL. Dans le scénario le plus courant, la source de données est un système de gestion de base de données relationnelle (SGBDR). Le déploiement du modèle de stockage requiert une base de données et des tables qui correspondent aux entités définies dans le schéma. L'implémentation peut également requérir des clés étrangères dans les tables de données et/ou les tables de liaison pour prendre en charge les associations.
Le modèle EDM peut être utilisé avec une base de données existante en mappant la base de données et les tables aux types EDM. Les modèles objet de programmation existants peuvent également être mappés aux types EDM.
Voir aussi
Concepts
Relations du modèle Entity Data Model
Types de modèles EDM
Élément EntityType (CSDL)
Élément EntitySet (EntityContainer CSDL)
Élément Association (CSDL)
Élément AssociationSet (EntityContainer CSDL)
Élément EntityContainer (CSDL)