Condividi tramite


Mapping di un modello concettuale a uno schema di archiviazione

Entity Framework fornisce una visualizzazione basata sugli oggetti dei dati tabulari, espressi come tipi di entità. Uno sviluppatore di applicazioni deve occuparsi solo della programmazione in base al modello a oggetti generato dal modello concettuale, anziché doversi preoccupare anche dello schema del database e di come accedere agli oggetti di database e trasformarli in oggetti di programmazione. In Entity Framework vengono utilizzati mapping e schemi dei modelli per trasformare le operazioni di creazione, lettura, aggiornamento ed eliminazione di entità in operazioni equivalenti nell'origine dati.

NoteNota

Tutti i frammenti di file di mapping illustrati in questa sezione sono generati dallo strumento Generatore EDM (EdmGen.exe).

Modello concettuale

Il modello concettuale è uno schema Entity Data Model (EDM) che definisce le entità e le associazioni in EDM. La sintassi XML che definisce questo modello è detta CSDL (Conceptual Schema Definition Language). 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. È inoltre possibile utilizzare proprietà aggiuntive per specificare il supporto dei valori Null o per assegnare un valore predefinito. Le associazioni definiscono le relazioni tra entità. La terminologia e gli elementi del linguaggio Entity Framework sono illustrati in modo più dettagliato in Terminologia relativa a Entity Framework.

Nel frammento XML seguente viene rappresentata una parte del modello concettuale per School EDM che definisce i tipi di entità Course e Department correlati dall'associazione FK_Course_Department, con altre entità e associazioni rimosse.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel" Alias="Self" 
  xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SchoolEntities">
    <EntitySet Name="Course" EntityType="SchoolModel.Course" />
    <EntitySet Name="Department" EntityType="SchoolModel.Department" />
    ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.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="Int32" Nullable="false" />
    <Property Name="Title" Type="String" Nullable="false" 
      MaxLength="100" Unicode="true" FixedLength="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" />
    ...
    <NavigationProperty Name="Course" 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="*" />
  </Association>
  ...
</Schema>

Modello di archiviazione

Un modello di dati separato utilizza SSDL (Store Schema Definition Language) per descrivere il modello logico per i dati persistenti, archiviati in genere in un database relazionale. 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.

<?xml version="1.0" encoding="utf-8"?>
<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/2006/04/edm/ssdl">
  <EntityContainer Name="dbo">
    <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
      store:Type="Tables" /> 
    <EntitySet Name="Department" 
      EntityType="SchoolModel.Store.Department" store:Type="Tables" />
     ...
    <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" />
    ...
  </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" />
    ...
  </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="CourseID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
  ...
</Schema>

Specifica di mapping

Una specifica di mapping utilizza MSL (Mapping Specification Language) per connettere i tipi dichiarati nel modello concettuale ai metadati del database dichiarati nel 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.

<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" 
  xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="dbo" 
    CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Course">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)">
        <MappingFragment StoreEntitySet="Course">
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
          <ScalarProperty Name="Title" ColumnName="Title" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Department">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Department)">
        <MappingFragment StoreEntitySet="Department">
         <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
          <ScalarProperty Name="Name" ColumnName="Name" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    ...
    <AssociationSetMapping Name="FK_Course_Department" 
      TypeName="SchoolModel.FK_Course_Department" 
      StoreEntitySet="Course">
      <EndProperty Name="Department">
        <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </EndProperty>
      <EndProperty Name="Course">
        <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      </EndProperty>
      <Condition ColumnName="DepartmentID" IsNull="false" />
    </AssociationSetMapping>
    ...
  </cs: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. Nel database relazionale potrebbe ad esempio venire utilizzata più di una tabella per l'archiviazione dei dati correlati a ogni dipendente. Una tabella potrebbe contenere informazioni sul contatto per tutte le persone e una tabella distinta correlata potrebbe contenere informazioni relative solo ai dipendenti. Entity Framework consente agli sviluppatori di definire le entità utilizzando gerarchie di ereditarietà e di mappare un'entità ai dati di più tabelle in un database, con supporto completo per operazioni di aggiornamento, inserimento ed eliminazione dei dati. Per ulteriori informazioni, vedere Modellazione dei dati in Entity Framework.

Vedere anche

Concetti

Terminologia relativa a Entity Framework

Altre risorse

Guida introduttiva (Entity Framework)
Specifiche EDM
Definizione di modelli di dati avanzati (attività di Entity Framework)
Specifica di schemi e mapping (Entity Framework)