Procédure : définir un modèle avec l'héritage TPT (table par type) (Entity Framework)
Cette rubrique décrit comment créer manuellement un modèle conceptuel ayant un héritage TPT (table par type). L'héritage TPT (table par type) utilise une table distincte de la base de données pour maintenir des données des propriétés non héritées et des propriétés de clé pour chaque type de la hiérarchie d'héritage.
Remarque : |
---|
La méthode recommandée pour définir un modèle avec l'héritage TPT (table par type) est d'utiliser ADO.NET Entity Data Model Tools.Pour plus d'informations, consultez Walkthrough: Mapping Inheritance - Table-per-Type. |
Les principales étapes pour définir manuellement un modèle avec l'héritage TPT (table par type) sont les suivantes :
Définissez un jeu d'entités dans le modèle conceptuel qui contiendra le type d'entité de base et les types dérivés. Pour plus d'informations, consultez Élément EntitySet (CSDL).
Définissez des types d'entité dérivés dans le modèle conceptuel à l'aide de l'attribut BaseType et définissez uniquement des propriétés non héritées sur les types dérivés. Pour plus d'informations, consultez Élément EntityType (CSDL).
Mappez le type d'entité de base et les types dérivés dans le même élément EntitySetMapping en MSL (Mapping Specification Language). Mappez des propriétés héritées aux colonnes de table, le cas échéant. Utilisez la syntaxe
IsTypeOf
lors de la définition de la valeur de l'attribut TypeName. Pour plus d'informations, consultez Élément EntitySetMapping (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).
Pour créer le modèle de stockage
Ajoutez à votre projet le fichier XML suivant et nommez-le
School.ssdl
.<?xml version="1.0" encoding="utf-8" ?> <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="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" /> <EntitySet Name="OnlineCourse" EntityType="SchoolModel.Store.OnlineCourse" store:Type="Tables" Schema="dbo" /> <EntitySet Name="OnsiteCourse" EntityType="SchoolModel.Store.OnsiteCourse" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="100" /> <Property Name="Credits" Type="int" Nullable="false" /> <Property Name="DepartmentID" Type="int" Nullable="false" /> </EntityType> <EntityType Name="OnlineCourse"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="URL" Type="nvarchar" Nullable="false" MaxLength="100" /> </EntityType> <EntityType Name="OnsiteCourse"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Days" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Time" Type="smalldatetime" Nullable="false" /> </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 :Un seul jeu d'entités, Courses, est défini pour les trois types d'entité : Course, OnlineCourse et OnsiteCourse.
Les types d'entité OnlineCourse et OnsiteCourse sont des types dérivés comme indiqué par l'attribut
BaseType
dans leurs définitions.Les propriétés définies pour les types d'entité OnlineCourse et OnsiteCourse sont uniquement des propriétés non héritées.
<?xml version="1.0" encoding="utf-8" ?> <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="Courses" EntityType="SchoolModel.Course" /> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="Int32" Nullable="false" /> <Property Name="Title" Type="String" Nullable="false" MaxLength="100" Unicode="true" FixedLength="false" /> <Property Name="Credits" Type="Int32" Nullable="false" /> <Property Name="DepartmentID" Type="Int32" Nullable="false" /> </EntityType> <EntityType Name="OnlineCourse" BaseType="SchoolModel.Course"> <Property Name="URL" Type="String" Nullable="false" MaxLength="100" Unicode="true" FixedLength="false" /> </EntityType> <EntityType Name="OnsiteCourse" BaseType="SchoolModel.Course"> <Property Name="Location" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <Property Name="Days" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <Property Name="Time" Type="DateTime" Nullable="false" /> </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 :Le mappage des types d'entité Course, OnlineCourse et OnsiteCourse est défini dans le même élément EntitySetMapping.
Les propriétés héritées CourseID de OnlineCourse et OnsiteCourse sont mappées aux colonnes correspondantes dans les tables de base de données sous-jacentes.
Pour chaque mappage de type d'entité, la syntaxe
IsTypeOf
est utilisée pour indiquer le type d'entité mappé.
<?xml version="1.0" encoding="utf-8" ?> <Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="Courses"> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)"> <MappingFragment StoreEntitySet="Course"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="Title" ColumnName="Title" /> <ScalarProperty Name="Credits" ColumnName="Credits" /> <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnlineCourse)"> <MappingFragment StoreEntitySet="OnlineCourse"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="URL" ColumnName="URL" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnsiteCourse)"> <MappingFragment StoreEntitySet="OnsiteCourse"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="Location" ColumnName="Location" /> <ScalarProperty Name="Days" ColumnName="Days" /> <ScalarProperty Name="Time" ColumnName="Time" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
Voir aussi
Tâches
Procédure : définir un modèle avec l'héritage TPH (table par hiérarchie) (Entity Framework)
Autres ressources
Spécifications CSDL, SSDL et MSL
Entity Data Model: Inheritance
Définition de modèles de données avancés (Tâches Entity Framework)