Condividi tramite


Schemi (EDM)

Uno schema Entity Data Model (EDM) è un file di testo XML che descrive tipi di entità e di relazione. Lo schema definisce inoltre un contenitore all'interno del quale le istanze di tali tipi sono organizzate in modo logico. Le entità e le associazioni in EDM definiscono sia i tipi di base installati con Entity Framework sia i tipi progettati dagli sviluppatori.

Uno schema di progettazione è scritto in Conceptual Schema Definition Language (CSDL). Un secondo schema scritto in Store Schema Definition Language (SSDL) definisce il modello di archiviazione per un'applicazione che utilizza EDM.

In questo argomento vengono descritti gli schemi di progettazione scritti in CSDL. Per ulteriori informazioni sui metadati di archiviazione e gli schemi di mapping, vedere Specifica di schemi e mapping (Entity Framework).

L'elemento di livello superiore in uno schema assegna uno spazio dei nomi all'interno del quale si applicano regole di univocità dei nomi. I tipi definiti nello schema abbreviato seguente sono organizzati in modo logico nello spazio dei nomi MyCompany.LOBSchema. Questo spazio dei nomi è simile a uno spazio dei nomi in programmazione orientata a oggetti che contiene classi e codice procedurale. EDM non consente di definire routine. Per ulteriori informazioni sull'implementazione di routine in EDM, vedere Metodi di supporto (EDM).

Tutte le entità e le associazioni definite nello schema seguente dispongono di un nome completo, ad esempio MyCompany.LOBSchema.Customer. Nell'esempio i nomi completi sono abbreviati tramite l'alias Self dichiarato per lo spazio dei nomi MyCompany.LOBSchema, come nell'utilizzo Self.Customer.

Le entità e le associazioni vengono definite nel corpo dello schema. Le proprietà delle entità definite in questo esempio vengono omesse per mostrare la struttura complessiva di uno schema CSDL.

<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns="https://schemas.microsoft.com/ado/2006/04/edm" 
        Namespace="MyCompany.LOBSchema" Alias="Self">

    <Documentation>
      <Summary>Conceptual schema (csdl)</Summary>
      <LongDescription>This schema is an example showing 
        general syntax.</LongDescription>
    </Documentation>

    <EntityType Name="Customer">
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <EntityType Name="Order">
        <Key>
            <PropertyRef Name="OrderId" />
        </Key>
        <Property Name="OrderId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <Association Name="Customer_Order">
        <End Role="Customer" Type="Self.Customer" Multiplicity="0..1" />
        <End Role="Order" Type="Self.Order" Multiplicity="*" />
    </Association>

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer" />
        <EntitySet Name="Orders" EntityType="Self.Order" />
        <AssociationSet Name="Customer_Orders" Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers" />
            <End Role="Order" EntitySet="Orders" />
        </AssociationSet>
    </EntityContainer>
</Schema>

Un alias per uno schema definito in un altro file CSDL può essere specificato con il tag Using, in modo che eventuali tipi esistenti negli schemi esterni possano essere utilizzati nello spazio dei nomi definito senza sintassi completa.

Negli schemi completi le dichiarazioni di entità includono proprietà. Una delle proprietà viene designata come proprietà Key. L'attributo Key di un oggetto EntityType specifica una o più proprietà dell'entità come Key. Key può essere composto da più proprietà. Key identifica in modo univoco le istanze di un'entità per tutte le operazioni.

All'interno del tag EntityType di apertura dell'esempio seguente, in seguito all'assegnazione dell'attributo Name per l'entità, all'attributo Key viene assegnato CustomerId. L'attributo Type della proprietà CustomerIdKey viene impostato su Guid per specificare un valore univoco per Key. La dichiarazione della proprietà CustomerId continua nella seconda riga di questo segmento CSDL.

    <EntityType Name="Customer" >
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <Property Name="Title" Type="String" Nullable="false" />
    </EntityType>

Nell'ultima riga dell'esempio viene dichiarata una proprietà denominata Title e viene assegnato l'oggetto Type della proprietà Title come String. La proprietà Title identifica il ruolo del cliente. La proprietà Title non può essere Null, in base a quanto specificato dal vincolo Nullability="false". L'attributo Default del tipo String della proprietà Title viene impostato su "NewHire".

Come illustrato nell'esempio seguente, è possibile specificare una chiave composta.

<EntityType Name="EmployeePayHistory">
    <Key>
      <PropertyRef Name="EmployeeID" />
      <PropertyRef Name="RateChangeDate" />
    </Key>
    <Property Name="EmployeeID" Type="Int32" Nullable="false" />
    <Property Name="RateChangeDate" Type="DateTime" Nullable="false"/>
    <Property Name="Rate" Type="Decimal" Nullable="false"/>
    <Property Name="PayFrequency" Type="Boolean" Nullable="false" />
    <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
    <NavigationProperty Name="Employee"
Relationship="Adventureworks.FK_EmployeePayHistory_Employee_EmployeeID"
 FromRole="EmployeePayHistory" ToRole="Employee" />
  </EntityType>

Contenitore di entità

Gli schemi che utilizzano EDM definiscono un contenitore di entità per specificare gli insiemi di tipi di dati che saranno disponibili nello spazio dei nomi definito. Il contenitore di entità costituisce l'elemento di base per lo spazio dei nomi nel modello a oggetti programmabile che verrà compilato dallo schema CSDL.

Nella gerarchia XML l'elemento EntityContainer è distinto dall'elemento Schema anche se EntityContainer è definito in uno schema. Questo aspetto è importante per il mapping dell'elemento EntityContainer all'archivio. I tag EntityContainer nello schema concettuale vengono mappati agli elementi EntityContainer corrispondenti nei metadati di archiviazione. Si noti che nel file di mapping il nome completo di EntityContainer non include il nome dello spazio dei nomi dello schema.

I set di entità eseguono la modellazione delle classi del modello a oggetti programmabile. I set di associazioni definiscono l'ambito delle relazioni. Per ulteriori informazioni sui set di entità e i set di associazioni, vedere Set di entità (EDM) e Set di associazioni (EDM).

Il segmento di schema seguente contiene la dichiarazione di EntityContainer per lo spazio dei nomi LOBSchemaData nello spazio dei nomi MyCompany.LOBSchema.

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer"/>
        <EntitySet Name="Orders" EntityType="Self.Order"/>
        <AssociationSet Name="Customer_Orders" 
                          Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers"/>
            <End Role="Order" EntitySet="Orders"/>
        </AssociationSet>
    </EntityContainer>

Questa dichiarazione di EntityContainer include tutte le entità e le associazioni definite nei segmenti di codice precedenti, ora sotto forma di set specificati dai tag EntitySet e AssociationSet.

Quando le specifiche di questo schema vengono implementate come tipi di dati, ogni istanza di un oggetto Customer o Order sarà un membro dell'oggetto EntitySet appropriato. Questo contenitore di entità definisce set di entità Customer e Order denominati in base alla rispettiva forma plurale, ovvero Customers e Orders. Gli sviluppatori possono definire convenzioni di denominazione personalizzate. Per ulteriori informazioni sul modo in cui i nomi corrispondono a quelli nei metadati di archiviazione e nella specifica di mapping, vedere Specifica di schemi e mapping (Entity Framework).

I tag AssociationSet nella dichiarazione di EntityContainer precedente specificano un set di associazioni denominato Customer_Orders. Questo set di associazioni contiene istanze dell'associazione Customer_Order.

Questi elementi (EntityType, EntitySet, Associazione, AssociationSete EntityContainer) si combinano per formare la struttura di base di uno schema. Per ulteriori informazioni su ciascuna riga per le dichiarazioni negli schemi, vedere Specifica di schemi e mapping (Entity Framework).

Distribuzione

La specifica EDM non impone il modello di archiviazione utilizzato in seguito alla definizione dei tipi di entità in CSDL. Nello scenario più comune l'origine dati è un sistema di gestione di database relazionali (RDBMS). La distribuzione del modello di archiviazione richiede la creazione di un database e di tabelle corrispondenti alle entità definite nello schema. L'implementazione può inoltre richiedere chiavi esterne nelle tabelle dati e/o nelle tabelle dei collegamenti per supportare le associazioni.

EDM può essere utilizzato con un database esistente eseguendo il mapping del database e delle tabelle ai tipi EDM. È inoltre possibile eseguire il mapping dei modelli a oggetti di programmazione esistenti ai tipi EDM.

Vedere anche

Concetti

Relazioni in Entity Data Model
Tipi EDM (Entity Data Model)
Elemento EntityType (CSDL)
Elemento EntitySet (EntityContainer CSDL)
Elemento Association (CSDL)
Elemento AssociationSet (EntityContainer CSDL)
Elemento EntityContainer (CSDL)

Altre risorse

Specifica di schemi e mapping (Entity Framework)