Mapping di un modello concettuale a un modello di archiviazione

Entity Framework utilizza un modello concettuale per fornire una visualizzazione dei dati basata sugli oggetti, espressa come tipi di entità e associazioni. Uno sviluppatore di applicazioni deve occuparsi solo della programmazione delle classi che sono generate dal modello concettuale, anziché doversi preoccupare anche dello schema dell'archivio e di come accedere agli oggetti in tale archivio e trasformarli in oggetti di programmazione. In Entity Framework vengono utilizzati un modello concettuale, un modello di archiviazione e il mapping tra questi modelli per trasformare le operazioni di creazione, lettura, aggiornamento ed eliminazione delle entità in operazioni equivalenti nell'origine dati.

Bb399232.note(it-it,VS.100).gifNota:
Tutti i frammenti di file di mapping illustrati in questa sezione sono generati dalla Entity Data Model Wizard.

Modello concettuale

Il modello concettuale per un'applicazione esprime entità e relazioni in Conceptual Schema Definition Language (CSDL) che è un'implementazione dell'Entity Data Model. CSDL è un linguaggio basato su XML. Ogni tipo di entità definito in CSDL dispone di un nome, di una chiave per l'identificazione univoca delle istanze e di un set di proprietà. I tipi di dati assegnati alle proprietà vengono specificati come tipi semplici, ovvero proprietà scalari, o come tipi complessi, ovvero tipi costituiti da una o più proprietà scalari o complesse. Gli attributi XML possono inoltre specificare valori Null o assegnare un valore predefinito. Le associazioni definiscono le relazioni tra entità. Gli elementi del linguaggio e la terminologia di Entity Framework sono spiegati più dettagliatamente in Terminologia relativa a Entity Framework.

Nel frammento XML seguente viene rappresentata una parte del modello concettuale School (basato sul database di esempio School). Nell'esempio vengono mostrati i tipi di entità Course e Department che sono correlati tramite l'associazione FK_Course_Department, con altre entità e associazioni rimosse.

<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">
   <EntitySet Name="Courses" EntityType="SchoolModel.Course" />
   <EntitySet Name="Departments" EntityType="SchoolModel.Department" />

  <AssociationSet Name="FK_Course_Department" 
                  Association="SchoolModel.FK_Course_Department">
            <End Role="Department" EntitySet="Departments" />
            <End Role="Course" EntitySet="Courses" />
  </AssociationSet>

  </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" />
       <NavigationProperty Name="Department" 
                       Relationship="SchoolModel.FK_Course_Department" 
                       FromRole="Course" ToRole="Department" />
  </EntityType>

  <EntityType Name="Department">
       <Key>
         <PropertyRef Name="DepartmentID" />
       </Key>
       <Property Name="DepartmentID" Type="Int32" Nullable="false" />
       <Property Name="Name" Type="String" Nullable="false" 
                 MaxLength="50" Unicode="true" FixedLength="false" />
       <Property Name="Budget" Type="Decimal" Nullable="false" 
                 Precision="19" Scale="4" />
       <Property Name="StartDate" Type="DateTime" Nullable="false" />
       <Property Name="Administrator" Type="Int32" />
       <NavigationProperty Name="Courses" 
                       Relationship="SchoolModel.FK_Course_Department" 
                       FromRole="Department" ToRole="Course" />
  </EntityType>
       
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Department" 
         Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Department">
              <PropertyRef Name="DepartmentID" />
            </Principal>
            <Dependent Role="Course">
              <PropertyRef Name="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>

      </Schema>

Modello di archiviazione

Il modello di archiviazione viene descritto con il Store Schema Definition Language (SSDL). I tipi di dati delle proprietà dichiarate nei file SSDL sono quelli del modello di archiviazione. In questo frammento di modello di archiviazione viene illustrato un esempio di metadati di archiviazione per le tabelle Course e Department nel database School correlate dalla chiave esterna FK_Course_Department, con altre entità rimosse.

<Schema Namespace="SchoolModel.Store" Alias="Self" 
        Provider="System.Data.SqlClient" ProviderManifestToken="2005" 
       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="Department" 
              EntityType="SchoolModel.Store.Department" 
              store:Type="Tables" Schema="dbo" />

    <AssociationSet Name="FK_Course_Department" 
                  Association="SchoolModel.Store.FK_Course_Department">
            <End Role="Department" EntitySet="Department" />
            <End Role="Course" EntitySet="Course" />
    </AssociationSet>

  </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="Department">
       <Key>
         <PropertyRef Name="DepartmentID" />
       </Key>
       <Property Name="DepartmentID" Type="int" Nullable="false" />
       <Property Name="Name" Type="nvarchar" Nullable="false" 
                 MaxLength="50" />
       <Property Name="Budget" Type="money" Nullable="false" />
       <Property Name="StartDate" Type="datetime" Nullable="false" />
       <Property Name="Administrator" Type="int" />
  </EntityType>

  <Association Name="FK_Course_Department">
       <End Role="Department" Type="SchoolModel.Store.Department" 
            Multiplicity="1" />
       <End Role="Course" Type="SchoolModel.Store.Course" 
            Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Department">
              <PropertyRef Name="DepartmentID" />
            </Principal>
            <Dependent Role="Course">
              <PropertyRef Name="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
        
</Schema>

Specifica di mapping

Una specifica di mapping utilizza Mapping Specification Language (MSL) per eseguire il mapping del modello concettuale al modello di archiviazione. In questo frammento MSL viene illustrato un mapping uno-a-uno tra il modello concettuale e quello di archiviazione per le entità Course e Department nel modello School.

<Mapping Space="C-S" 
          xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
  <EntityContainerMapping 
                 StorageEntityContainer="SchoolModelStoreContainer" 
                 CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Courses">
     <EntityTypeMapping TypeName="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>
    </EntitySetMapping>
    <EntitySetMapping Name="Departments">
     <EntityTypeMapping TypeName="SchoolModel.Department">
      <MappingFragment StoreEntitySet="Department">
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
       <ScalarProperty Name="Name" ColumnName="Name" />
       <ScalarProperty Name="Budget" ColumnName="Budget" />
       <ScalarProperty Name="StartDate" ColumnName="StartDate" />
       <ScalarProperty Name="Administrator" 
                       ColumnName="Administrator" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
   </EntityContainerMapping>
</Mapping>

Discussione

Nel modello School illustrato in questa sezione viene utilizzato un mapping semplice uno-a-uno tra un'entità concettuale e una tabella di database, ma in Entity Framework sono supportati mapping più complessi, quali il mapping tabella-per-gerarchia o il mapping tabella-per-tipo. Per ulteriori informazioni, vedere Entity Data Model Tools Scenarios e Definizione di modelli di dati avanzati (attività di Entity Framework).

Vedere anche

Concetti

Terminologia relativa a Entity Framework

Altre risorse

Guida introduttiva (Entity Framework)
Definizione di modelli di dati avanzati (attività di Entity Framework)
Specifiche CSDL, SSDL e MSL