Procédure : définir un modèle avec une même entité mappée à deux tables
Cette rubrique décrit comment créer manuellement un modèle conceptuel dans lequel un type d'entité est mappé à deux tables dans la base de données sous-jacente. Vous pouvez utiliser ces mêmes concepts pour mapper un type d'entité à plus de deux tables.
Remarque : |
---|
La méthode recommandée pour définir un modèle avec un type d'entité mappé à plusieurs tables est d'utiliser ADO.NET Entity Data Model Tools.Pour plus d'informations, consultez Walkthrough: Mapping an Entity to Multiple Tables. |
Vous devez mapper un type d'entité à plusieurs tables uniquement si les conditions suivantes sont remplies :
Les tables auxquelles vous mappez partagent une clé commune.
Le type d'entité mappé a des entrées dans chaque table sous-jacente. En d'autres termes, le type d'entité représente des données qui ont une correspondance ligne à ligne entre les deux tables ; le type d'entité représente une jointure interne des deux tables.
Les principales étapes pour la définir manuellement un modèle avec une entité mappée à deux tables sont les suivantes :
Définissez un type d'entité avec des propriétés qui correspondent aux colonnes dans chacune des tables sous-jacentes. Pour plus d'informations, consultez Élément EntityType (CSDL).
Définissez le mappage du type d'entité en utilisant un élément MappingFragment pour chaque table sous-jacente. Pour plus d'informations, consultez Élément EntityTypeMapping et Élément MappingFragment (MSL).
L'exemple suivant suppose que vous avez installé l'exemple de base de données School et que vous avez configuré manuellement votre projet pour qu'il utilise Entity Framework . Pour plus d'informations, consultez Création de l'exemple de base de données School (Démarrage rapide d'Entity Framework) et Configuration d'Entity Framework (Tâches Entity Framework).
Remarque : |
---|
L'exemple suivant mappe un type d'entité aux tables Person et OfficeAssignement dans l'exemple de base de données School.Notez que les conditions pour le mappage d'un type d'entité à ces tables sont réunies.À savoir, une jointure interne des deux tables aura pour résultat tous ceux qui ont une affectation de bureau. |
Pour créer le modèle de stockage
Ajoutez à votre projet le fichier XML suivant et nommez-le
School.ssdl
.<Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl"> <EntityContainer Name="SchoolModelStoreContainer"> <EntitySet Name="OfficeAssignment" EntityType="SchoolModel.Store.OfficeAssignment" store:Type="Tables" Schema="dbo" /> <EntitySet Name="Person" EntityType="SchoolModel.Store.Person" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="OfficeAssignment"> <Key> <PropertyRef Name="InstructorID" /> </Key> <Property Name="InstructorID" Type="int" Nullable="false" /> <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Timestamp" Type="timestamp" Nullable="false" StoreGeneratedPattern="Computed" /> </EntityType> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Name="PersonID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="HireDate" Type="datetime" /> <Property Name="EnrollmentDate" Type="datetime" /> </EntityType> </Schema>
Pour créer le modèle conceptuel
Ajoutez à votre projet le fichier XML suivant et nommez-le
School.csdl
. Notez les points suivants :Le type d'entité Instructor a des propriétés qui mappent à toutes les colonnes des tables Person et OfficeAssignment (voir le modèle de stockage ci-dessus pour plus d'informations sur les tables).
Remarque : Comme le type d'entité Instructor est un type hérité, il hérite de toutes les propriétés de son type de base, Person.En plus des propriétés propres au type Instructor, le type d'entité Instructor a des propriétés qui mappent à toutes les colonnes des tables sous-jacentes.
<Schema Namespace="SchoolModel" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="https://schemas.microsoft.com/ado/2008/09/edm"> <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true"> <EntitySet Name="People" EntityType="SchoolModel.Person" /> </EntityContainer> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Type="Int32" Name="PersonID" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> <Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="DateTime" Name="EnrollmentDate" /> </EntityType> <EntityType Name="Instructor" BaseType="SchoolModel.Person" > <Property Type="DateTime" Name="HireDate" Nullable="false" /> <Property Type="Binary" Name="Timestamp" Nullable="false" MaxLength="8" FixedLength="true" annotation:StoreGeneratedPattern="Computed" /> <Property Type="String" Name="Location" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> </EntityType> </Schema>
Pour définir le mappage entre le modèle conceptuel et le modèle de stockage.
Ajoutez à votre projet le fichier XML suivant et nommez-le
School.msl
. Notez les points suivants :- Dans l'élément EntityTypeMapping pour le type d'entité Instructor, les éléments MappingFragment distincts sont utilisés pour mapper des propriétés aux tables appropriées.
<Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="People"> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="HireDate" ColumnName="HireDate" /> <Condition ColumnName="HireDate" IsNull="false" /> </MappingFragment> <MappingFragment StoreEntitySet="OfficeAssignment"> <ScalarProperty Name="PersonID" ColumnName="InstructorID" /> <ScalarProperty Name="Timestamp" ColumnName="Timestamp" /> <ScalarProperty Name="Location" ColumnName="Location" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="LastName" ColumnName="LastName" /> <ScalarProperty Name="FirstName" ColumnName="FirstName" /> <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
Voir aussi
Autres ressources
Spécifications CSDL, SSDL et MSL
Définition de modèles de données avancés (Tâches Entity Framework)