Condividi tramite


Procedura: definire un modello con ereditarietà tabella per tipo (Entity Framework)

In questo argomento viene descritto come creare manualmente un modello concettuale con una gerarchia di ereditarietà tabella per tipo. L'ereditarietà tabella per tipo prevede l'utilizzo di una tabella separata nel database per la gestione dei dati relativi alle proprietà non ereditate e alle proprietà chiave di ogni tipo della gerarchia di ereditarietà.

Bb738685.note(it-it,VS.100).gifNota:
Per definire un modello con ereditarietà tabella per tipo, è consigliabile utilizzare gli oggetti ADO.NET Entity Data Model Tools.Per ulteriori informazioni, vedere Walkthrough: Mapping Inheritance - Table-per-Type.

I passaggi di base per la definizione manuale di un modello con ereditarietà tabella per tipo sono i seguenti:

  1. Definire un set di entità nel modello concettuale che conterrà il tipo di entità di base e i tipi derivati. Per ulteriori informazioni, vedere Elemento EntitySet (CSDL).

  2. Definire tipi di entità derivati nel modello concettuale tramite l'attributo BaseType e definire esclusivamente proprietà non ereditate per i tipi derivati. Per ulteriori informazioni, vedere Elemento EntityType (CSDL).

  3. Eseguire il mapping del tipo di entità di base e dei tipi derivati nello stesso elemento EntitySetMapping in MSL (Mapping Specification Language). Se possibile, eseguire il mapping delle proprietà ereditate alle colonne della tabella. Utilizzare la sintassi IsTypeOf in caso di impostazione del valore dell'attributo TypeName. Per ulteriori informazioni, vedere Elemento EntitySetMapping (MSL).

Nell'esempio seguente si suppone che sia stato installato il database di esempio School e che il progetto sia stato configurato manualmente per l'utilizzo di Entity Framework . Per ulteriori informazioni, vedere Creazione del database di esempio School (Guida rapida di Entity Framework) e Configurazione di Entity Framework (attività di Entity Framework).

Per creare il modello di archiviazione

  1. Aggiungere il file XML seguente al progetto e denominarlo 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>
    

Per creare il modello concettuale

  1. Aggiungere il file XML seguente al progetto e denominarlo School.csdl. Tenere presente quanto segue:

    • Viene definito un solo set di entità, Courses, per i tre tipi di entità: Course, OnlineCourse e OnsiteCourse.

    • I tipi di entità OnlineCourse e OnsiteCourse sono tipi derivati, come indicato dall'attributo BaseType nelle rispettive definizioni.

    • Le proprietà definite per i tipi di entità OnlineCourse e OnsiteCourse sono solo proprietà non ereditate.

    <?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>
    

Per definire il mapping tra il modello concettuale e il modello di archiviazione

  1. Aggiungere il file XML seguente al progetto e denominarlo School.msl. Tenere presente quanto segue:

    • Il mapping per i tipi di entità Course, OnlineCourse e OnsiteCourse viene definito nello stesso elemento EntitySetMapping.

    • Le proprietà ereditate di CourseID per OnlineCourse e OnsiteCourse vengono mappate alle colonne corrispondenti nelle tabelle di database sottostanti.

    • Per ogni tipo di mapping di entità, viene utilizzata la sintassi IsTypeOf per indicare il tipo di entità sottoposto a mapping.

    <?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>
    

Vedere anche

Attività

Procedura: definire un modello con ereditarietà tabella per gerarchia (Entity Framework)

Altre risorse

Specifiche CSDL, SSDL e MSL
Entity Data Model: Inheritance
Definizione di modelli di dati avanzati (attività di Entity Framework)