Specifica MSL

Il linguaggio MSL (Mapping Specification Language) è un linguaggio basato su XML che descrive il mapping tra il modello concettuale e il modello di archiviazione di un'applicazione Entity Framework.

In un'applicazione Entity Framework i metadati di mapping vengono caricati da un file con estensione msl (scritto in MSL) in fase di compilazione. Entity Framework usa i metadati di mapping in fase di esecuzione per convertire le query sul modello concettuale in comandi specifici dell'archivio.

Entity Framework Designer (EF Designer) archivia le informazioni di mapping in un file con estensione edmx in fase di progettazione. In fase di compilazione, Entity Designer usa le informazioni in un file con estensione edmx per creare il file msl necessario per Entity Framework in fase di esecuzione

I nomi di tutti i tipi di modelli concettuale o di archiviazione a cui viene fatto riferimento in MSL devono essere qualificati dai rispettivi nomi dello spazio dei nomi. Per informazioni sul nome dello spazio dei nomi del modello concettuale, vedere Specifica CSDL. Per informazioni sul nome dello spazio dei nomi del modello di archiviazione, vedere Specifica SSDL.

Le versioni di MSL sono differenziate in base agli spazi dei nomi XML.

Versione MSL Spazio dei nomi XML
MSL v1 urn:schemas-microsoft-com:windows:storage:mapping:CS
MSL v2 https://schemas.microsoft.com/ado/2008/09/mapping/cs
MSL v3 https://schemas.microsoft.com/ado/2009/11/mapping/cs

Elemento Alias (MSL)

L'elemento Alias nel linguaggio MSL (Mapping Specification Language) è un elemento figlio dell'elemento Mapping usato per definire gli alias per gli spazi dei nomi del modello concettuale e del modello di archiviazione. I nomi di tutti i tipi di modelli concettuale o di archiviazione a cui viene fatto riferimento in MSL devono essere qualificati dai rispettivi nomi dello spazio dei nomi. Per informazioni sul nome dello spazio dei nomi del modello concettuale, vedere Elemento schema (CSDL). Per informazioni sul nome dello spazio dei nomi del modello di archiviazione, vedere Elemento schema (SSDL).

L'elemento Alias non può avere elementi figlio.

Attributi applicabili

La tabella seguente descrive gli attributi che possono essere applicati all'elemento Alias .

Nome attributo Obbligatorio Valore
Chiave Alias per lo spazio dei nomi specificato dall'attributo Value .
Valore Spazio dei nomi per il quale il valore dell'elemento Key è un alias.

Esempio

Nell'esempio seguente viene illustrato un elemento Alias che definisce un alias, c, per i tipi definiti nel modello concettuale.

 <Mapping Space="C-S"
          xmlns="https://schemas.microsoft.com/ado/2009/11/mapping/cs">
   <Alias Key="c" Value="SchoolModel"/>
   <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
                           CdmEntityContainer="SchoolModelEntities">
     <EntitySetMapping Name="Courses">
       <EntityTypeMapping TypeName="c.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="c.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>

Elemento AssociationEnd (MSL)

L'elemento AssociationEnd nel linguaggio MSL (Mapping Specification Language) viene utilizzato quando le funzioni di modifica di un tipo di entità nel modello concettuale vengono mappate alle stored procedure nel database sottostante. Se una stored procedure di modifica accetta un parametro il cui valore è contenuto in una proprietà di associazione, l'elemento AssociationEnd esegue il mapping del valore della proprietà al parametro . Per ulteriori informazioni, vedere l'esempio seguente.

Per altre informazioni sul mapping delle funzioni di modifica dei tipi di entità alle stored procedure, vedere Elemento ModificationFunctionMapping (MSL) e Procedura dettagliata: Mapping di un'entità a stored procedure.

L'elemento AssociationEnd può avere gli elementi figlio seguenti:

  • ScalarProperty

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi applicabili all'elemento AssociationEnd .

Nome attributo Obbligatorio Valore
Associationset Nome dell'associazione di cui è in corso il mapping.
Da Valore dell'attributo FromRole della proprietà di navigazione che corrisponde all'associazione di cui viene eseguito il mapping. Per altre informazioni, vedere Elemento NavigationProperty (CSDL).
Per Valore dell'attributo ToRole della proprietà di navigazione che corrisponde all'associazione di cui viene eseguito il mapping. Per altre informazioni, vedere Elemento NavigationProperty (CSDL).

Esempio

Si consideri il tipo di entità del modello concettuale seguente:

 <EntityType Name="Course">
   <Key>
     <PropertyRef Name="CourseID" />
   </Key>
   <Property Type="Int32" Name="CourseID" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" MaxLength="100"
             FixedLength="false" Unicode="true" />
   <Property Type="Int32" Name="Credits" Nullable="false" />
   <NavigationProperty Name="Department"
                       Relationship="SchoolModel.FK_Course_Department"
                       FromRole="Course" ToRole="Department" />
 </EntityType>

Si consideri inoltre la seguente stored procedure:

 CREATE PROCEDURE [dbo].[UpdateCourse]
                                @CourseID int,
                                @Title nvarchar(50),
                                @Credits int,
                                @DepartmentID int
                                AS
                                UPDATE Course SET Title=@Title,
                                                              Credits=@Credits,
                                                              DepartmentID=@DepartmentID
                                WHERE CourseID=@CourseID;

Per eseguire il mapping della funzione di aggiornamento dell'entità Course a questa stored procedure, è necessario fornire un valore al parametro DepartmentID . Il valore di DepartmentID non corrisponde a una proprietà sul tipo di entità. È contenuto in un'associazione indipendente il cui mapping è illustrato di seguito:

 <AssociationSetMapping Name="FK_Course_Department"
                        TypeName="SchoolModel.FK_Course_Department"
                        StoreEntitySet="Course">
   <EndProperty Name="Course">
     <ScalarProperty Name="CourseID" ColumnName="CourseID" />
   </EndProperty>
   <EndProperty Name="Department">
     <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
   </EndProperty>
 </AssociationSetMapping>

Il codice seguente mostra l'elemento AssociationEnd utilizzato per eseguire il mapping della proprietà DepartmentID dell'associazione FK_Course_Department alla stored procedure UpdateCourse (a cui viene eseguito il mapping della funzione di aggiornamento del tipo di entità Course):

 <EntitySetMapping Name="Courses">
   <EntityTypeMapping TypeName="SchoolModel.Course">
     <MappingFragment StoreEntitySet="Course">
       <ScalarProperty Name="Credits" ColumnName="Credits" />
       <ScalarProperty Name="Title" ColumnName="Title" />
       <ScalarProperty Name="CourseID" ColumnName="CourseID" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="SchoolModel.Course">
     <ModificationFunctionMapping>
       <UpdateFunction FunctionName="SchoolModel.Store.UpdateCourse">
         <AssociationEnd AssociationSet="FK_Course_Department"
                         From="Course" To="Department">
           <ScalarProperty Name="DepartmentID"
                           ParameterName="DepartmentID"
                           Version="Current" />
         </AssociationEnd>
         <ScalarProperty Name="Credits" ParameterName="Credits"
                         Version="Current" />
         <ScalarProperty Name="Title" ParameterName="Title"
                         Version="Current" />
         <ScalarProperty Name="CourseID" ParameterName="CourseID"
                         Version="Current" />
       </UpdateFunction>
     </ModificationFunctionMapping>
   </EntityTypeMapping>
 </EntitySetMapping>

Elemento AssociationSetMapping (MSL)

L'elemento AssociationSetMapping nel linguaggio MSL (Mapping Specification Language) definisce il mapping tra un'associazione nel modello concettuale e nelle colonne della tabella nel database sottostante.

Le associazioni del modello concettuale sono tipi le cui proprietà rappresentano colonne di chiavi primarie ed esterne nel database sottostante. L'elemento AssociationSetMapping utilizza due elementi EndProperty per definire i mapping tra le proprietà del tipo di associazione e le colonne nel database. È possibile inserire condizioni su questi mapping con l'elemento Condition. Eseguire il mapping delle funzioni di inserimento, aggiornamento ed eliminazione per le associazioni alle stored procedure nel database con l'elemento ModificationFunctionMapping. Definire mapping di sola lettura tra associazioni e colonne di tabella usando una stringa Entity SQL in un elemento QueryView.

Nota

Se viene definito un vincolo referenziale per un'associazione nel modello concettuale, l'associazione non deve essere mappata a un elemento AssociationSetMapping . Se è presente un elemento AssociationSetMapping per un'associazione con un vincolo referenziale, i mapping definiti nell'elemento AssociationSetMapping verranno ignorati. Per altre informazioni, vedere Elemento ReferialConstraint (CSDL).

L'elemento AssociationSetMapping può avere gli elementi figlio seguenti

  • QueryView (zero o uno)
  • EndProperty (zero o due)
  • Condizione (zero o più)
  • ModificationFunctionMapping (zero o uno)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento AssociationSetMapping .

Nome attributo Obbligatorio valore
Nome Nome del set di associazioni del modello concettuale di cui è in corso il mapping.
Typename No Nome completo dello spazio dei nomi del tipo di associazione del modello concettuale di cui è in corso il mapping.
StoreEntitySet No Nome della tabella di cui è in corso il mapping.

Esempio

Nell'esempio seguente viene illustrato un elemento AssociationSetMapping in cui viene eseguito il mapping dell'associazione FK_Course_Department nel modello concettuale alla tabella Course del database. I mapping tra le proprietà del tipo di associazione e le colonne di tabella vengono specificati negli elementi EndProperty figlio.

 <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>
 </AssociationSetMapping>

Elemento ComplexProperty (MSL)

Un elemento ComplexProperty nel linguaggio MSL (Mapping Specification Language) definisce il mapping tra una proprietà di tipo complesso in un tipo di entità modello concettuale e colonne di tabella nel database sottostante. I mapping delle colonne delle proprietà vengono specificati negli elementi ScalarProperty figlio.

L'elemento della proprietà ComplexType può avere gli elementi figlio seguenti:

  • ScalarProperty (zero o più)
  • ComplexProperty (zero o più)
  • ComplexTypeMapping (zero o più)
  • Condizione (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi applicabili all'elemento ComplexProperty :

Nome attributo Obbligatorio valore
Nome Nome della proprietà complessa di un tipo di entità nel modello concettuale di cui è in corso il mapping.
Typename No Nome qualificato di spazio dei nomi del tipo di proprietà del modello concettuale.

Esempio

L'esempio seguente si basa sul modello School. Il tipo complesso seguente è stato aggiunto al modello concettuale:

 <ComplexType Name="FullName">
   <Property Type="String" Name="LastName"
             Nullable="false" MaxLength="50"
             FixedLength="false" Unicode="true" />
   <Property Type="String" Name="FirstName"
             Nullable="false" MaxLength="50"
             FixedLength="false" Unicode="true" />
 </ComplexType>

Le proprietà LastName e FirstName del tipo di entità Person sono state sostituite con una proprietà complessa, Name:

 <EntityType Name="Person">
   <Key>
     <PropertyRef Name="PersonID" />
   </Key>
   <Property Name="PersonID" Type="Int32" Nullable="false"
             annotation:StoreGeneratedPattern="Identity" />
   <Property Name="HireDate" Type="DateTime" />
   <Property Name="EnrollmentDate" Type="DateTime" />
   <Property Name="Name" Type="SchoolModel.FullName" Nullable="false" />
 </EntityType>

Il codice MSL seguente mostra l'elemento ComplexProperty utilizzato per eseguire il mapping della proprietà Name alle colonne nel database sottostante:

 <EntitySetMapping Name="People">
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="HireDate" ColumnName="HireDate" />
       <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" />
       <ComplexProperty Name="Name" TypeName="SchoolModel.FullName">
         <ScalarProperty Name="FirstName" ColumnName="FirstName" />
         <ScalarProperty Name="LastName" ColumnName="LastName" />  
       </ComplexProperty>
     </MappingFragment>
   </EntityTypeMapping>
 </EntitySetMapping>

Elemento ComplexTypeMapping (MSL)

L'elemento ComplexTypeMapping nel linguaggio msl (Mapping Specification Language) è un elemento figlio dell'elemento ResultMapping e definisce il mapping tra un'importazione di funzioni nel modello concettuale e una stored procedure nel database sottostante quando sono vere le condizioni seguenti:

  • Un tipo complesso concettuale viene restituito dall'importazione di funzioni.
  • I nomi delle colonne restituite dalla stored procedure non corrispondono esattamente ai nomi delle proprietà del tipo complesso.

Per impostazione predefinita, il mapping tra le colonne restituite da una stored procedure e un tipo complesso è basato sui nomi delle colonne e delle proprietà. Se i nomi di colonna non corrispondono esattamente ai nomi delle proprietà, è necessario utilizzare l'elemento ComplexTypeMapping per definire il mapping. Per un esempio del mapping predefinito, vedere Elemento FunctionImportMapping (MSL).

L'elemento ComplexTypeMapping può avere gli elementi figlio seguenti:

  • ScalarProperty (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi applicabili all'elemento ComplexTypeMapping .

Nome attributo Obbligatorio Valore
Typename Nome completo dello spazio dei nomi del tipo complesso di cui è in corso il mapping.

Esempio

Si consideri la stored procedure seguente:

 CREATE PROCEDURE [dbo].[GetGrades]
             @student_Id int
             AS
             SELECT     EnrollmentID as enroll_id,
                                                                             Grade as grade,
                                                                             CourseID as course_id,
                                                                             StudentID as student_id
                                               FROM dbo.StudentGrade
             WHERE StudentID = @student_Id

Si consideri anche il tipo complesso del modello concettuale seguente:

 <ComplexType Name="GradeInfo">
   <Property Type="Int32" Name="EnrollmentID" Nullable="false" />
   <Property Type="Decimal" Name="Grade" Nullable="true"
             Precision="3" Scale="2" />
   <Property Type="Int32" Name="CourseID" Nullable="false" />
   <Property Type="Int32" Name="StudentID" Nullable="false" />
 </ComplexType>

Per creare un'importazione di funzione che restituisce istanze del tipo complesso precedente, il mapping tra le colonne restituite dalla stored procedure e il tipo di entità deve essere definito in un elemento ComplexTypeMapping :

 <FunctionImportMapping FunctionImportName="GetGrades"
                        FunctionName="SchoolModel.Store.GetGrades" >
   <ResultMapping>
     <ComplexTypeMapping TypeName="SchoolModel.GradeInfo">
       <ScalarProperty Name="EnrollmentID" ColumnName="enroll_id"/>
       <ScalarProperty Name="CourseID" ColumnName="course_id"/>
       <ScalarProperty Name="StudentID" ColumnName="student_id"/>
       <ScalarProperty Name="Grade" ColumnName="grade"/>
     </ComplexTypeMapping>
   </ResultMapping>
 </FunctionImportMapping>

Elemento Condition (MSL)

L'elemento Condition nel linguaggio MSL (Mapping Specification Language) inserisce le condizioni sui mapping tra il modello concettuale e il database sottostante. Il mapping definito all'interno di un nodo XML è valido se vengono soddisfatte tutte le condizioni, come specificato negli elementi Condizione figlio. In caso contrario, il mapping non è valido. Ad esempio, se un elemento MappingFragment contiene uno o più elementi figlio Condition, il mapping definito all'interno del nodo MappingFragment sarà valido solo se vengono soddisfatte tutte le condizioni degli elementi Condition figlio.

Ogni condizione può essere applicata a un Nome (il nome di una proprietà dell'entità del modello concettuale, specificato dall'attributo Name ) o a ColumnName (il nome di una colonna nel database, specificato dall'attributo ColumnName ). Quando l'attributo Name è impostato, la condizione viene controllata in base al valore di una proprietà di entità. Quando l'attributo ColumnName è impostato, la condizione viene controllata rispetto a un valore di colonna. In un elemento Condition è possibile specificare solo uno degli attributi Name o ColumnName.

Nota

Quando l'elemento Condition viene utilizzato all'interno di un elemento FunctionImportMapping, solo l'attributo Name non è applicabile.

L'elemento Condition può essere figlio degli elementi seguenti:

  • AssociationSetMapping
  • ComplexProperty
  • EntitySetMapping
  • MappingFragment
  • EntityTypeMapping

L'elemento Condition non può contenere elementi figlio.

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi applicabili all'elemento Condition :

Nome attributo Obbligatorio Valore
ColumnName No Nome della colonna della tabella il cui valore viene utilizzato per valutare la condizione.
IsNull No True o False. Se il valore è True e il valore della colonna è Null oppure se il valore è False e il valore della colonna non è Null, la condizione è true. In caso contrario, la condizione è false.
Gli attributi IsNull e Value non possono essere usati contemporaneamente.
Valore No Valore con cui viene confrontato il valore della colonna. Se i valori sono uguali, la condizione è true. In caso contrario, la condizione è false.
Gli attributi IsNull e Value non possono essere usati contemporaneamente.
Nome No Nome della proprietà dell'entità del modello concettuale il cui valore viene utilizzato per valutare la condizione.
Questo attributo non è applicabile se l'elemento Condition viene utilizzato all'interno di un elemento FunctionImportMapping.

Esempio

Nell'esempio seguente vengono illustrati gli elementi Condition come elementi figlio degli elementi MappingFragment . Quando HireDate non è null e EnrollmentDate è null, i dati vengono mappati tra il tipo SchoolModel.Instructor e le colonne PersonID e HireDate della tabella Person . Quando EnrollmentDate non è null e HireDate è null, i dati vengono mappati tra il tipo SchoolModel.Student e le colonne PersonID e Enrollment della tabella Person .

 <EntitySetMapping Name="People">
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="FirstName" ColumnName="FirstName" />
       <ScalarProperty Name="LastName" ColumnName="LastName" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="HireDate" ColumnName="HireDate" />
       <Condition ColumnName="HireDate" IsNull="false" />
       <Condition ColumnName="EnrollmentDate" IsNull="true" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Student)">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="EnrollmentDate"
                       ColumnName="EnrollmentDate" />
       <Condition ColumnName="EnrollmentDate" IsNull="false" />
       <Condition ColumnName="HireDate" IsNull="true" />
     </MappingFragment>
   </EntityTypeMapping>
 </EntitySetMapping>

Elemento DeleteFunction (MSL)

L'elemento DeleteFunction nel linguaggio MSL (Mapping Specification Language) esegue il mapping della funzione di eliminazione di un tipo di entità o di un'associazione nel modello concettuale a una stored procedure nel database sottostante. Le stored procedure a cui le funzioni di modifica sono mappate devono essere dichiarate nel modello di archiviazione. Per altre informazioni, vedere Elemento Function (SSDL).

Nota

Se non si esegue il mapping di tutte e tre le operazioni di inserimento, aggiornamento o eliminazione di un tipo di entità alle stored procedure, le operazioni non mappate avranno esito negativo se eseguite in fase di esecuzione e viene generata un'eccezione UpdateException.

DeleteFunction applicato a EntityTypeMapping

Se applicato all'elemento EntityTypeMapping, l'elemento DeleteFunction esegue il mapping della funzione delete di un tipo di entità nel modello concettuale a una stored procedure.

L'elemento DeleteFunction può avere gli elementi figlio seguenti quando viene applicato a un elemento EntityTypeMapping :

  • AssociationEnd (zero o più)
  • ComplexProperty (zero o più)
  • ScalarProperty (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento DeleteFunction quando viene applicato a un elemento EntityTypeMapping.

Nome attributo Obbligatorio Valore
Functionname Nome completo dello spazio dei nomi della stored procedure a cui la funzione di eliminazione viene mappata. La stored procedure deve essere dichiarata nel modello di archiviazione.
RowsAffectedParameter No Nome del parametro di output che restituisce il numero di righe interessate.

Esempio

L'esempio seguente si basa sul modello School e mostra l'elemento DeleteFunction che esegue il mapping della funzione delete del tipo di entità Person alla stored procedure DeletePerson. La stored procedure DeletePerson viene dichiarata nel modello di archiviazione.

 <EntitySetMapping Name="People">
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="LastName" ColumnName="LastName" />
       <ScalarProperty Name="FirstName" ColumnName="FirstName" />
       <ScalarProperty Name="HireDate" ColumnName="HireDate" />
       <ScalarProperty Name="EnrollmentDate"
                       ColumnName="EnrollmentDate" />
     </MappingFragment>
 </EntityTypeMapping>
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <ModificationFunctionMapping>
       <InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
         <ScalarProperty Name="EnrollmentDate"
                         ParameterName="EnrollmentDate" />
         <ScalarProperty Name="HireDate" ParameterName="HireDate" />
         <ScalarProperty Name="FirstName" ParameterName="FirstName" />
         <ScalarProperty Name="LastName" ParameterName="LastName" />
         <ResultBinding Name="PersonID" ColumnName="NewPersonID" />
       </InsertFunction>
       <UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
         <ScalarProperty Name="EnrollmentDate"
                         ParameterName="EnrollmentDate"
                         Version="Current" />
         <ScalarProperty Name="HireDate" ParameterName="HireDate"
                         Version="Current" />
         <ScalarProperty Name="FirstName" ParameterName="FirstName"
                         Version="Current" />
         <ScalarProperty Name="LastName" ParameterName="LastName"
                         Version="Current" />
         <ScalarProperty Name="PersonID" ParameterName="PersonID"
                         Version="Current" />
       </UpdateFunction>
       <DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
         <ScalarProperty Name="PersonID" ParameterName="PersonID" />
       </DeleteFunction>
     </ModificationFunctionMapping>
   </EntityTypeMapping>
 </EntitySetMapping>

DeleteFunction applicato ad AssociationSetMapping

Se applicato all'elemento AssociationSetMapping, l'elemento DeleteFunction esegue il mapping della funzione delete di un'associazione nel modello concettuale a una stored procedure.

L'elemento DeleteFunction può avere gli elementi figlio seguenti quando viene applicato all'elemento AssociationSetMapping :

  • EndProperty

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento DeleteFunction quando viene applicato all'elemento AssociationSetMapping .

Nome attributo Obbligatorio Valore
Functionname Nome completo dello spazio dei nomi della stored procedure a cui la funzione di eliminazione viene mappata. La stored procedure deve essere dichiarata nel modello di archiviazione.
RowsAffectedParameter No Nome del parametro di output che restituisce il numero di righe interessate.

Esempio

L'esempio seguente si basa sul modello School e mostra l'elemento DeleteFunction usato per eseguire il mapping della funzione delete dell'associazione CourseInstructor alla stored procedure DeleteCourseInstructor. La stored procedure DeleteCourseInstructor viene dichiarata nel modello di archiviazione.

 <AssociationSetMapping Name="CourseInstructor"
                        TypeName="SchoolModel.CourseInstructor"
                        StoreEntitySet="CourseInstructor">
   <EndProperty Name="Person">
     <ScalarProperty Name="PersonID" ColumnName="PersonID" />
   </EndProperty>
   <EndProperty Name="Course">
     <ScalarProperty Name="CourseID" ColumnName="CourseID" />
   </EndProperty>
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >   
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </InsertFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </DeleteFunction>
   </ModificationFunctionMapping>
 </AssociationSetMapping>

Elemento EndProperty (MSL)

L'elemento EndProperty nel linguaggio MSL (Mapping Specification Language) definisce il mapping tra una fine o una funzione di modifica di un'associazione di modelli concettuali e il database sottostante. Il mapping delle colonne delle proprietà viene specificato in un elemento ScalarProperty figlio.

Quando un elemento EndProperty viene usato per definire il mapping per la fine di un'associazione di modelli concettuali, è figlio di un elemento AssociationSetMapping. Quando l'elemento EndProperty viene utilizzato per definire il mapping per una funzione di modifica di un'associazione di modelli concettuali, è un elemento figlio di un elemento InsertFunction o DeleteFunction.

L'elemento EndProperty può avere gli elementi figlio seguenti:

  • ScalarProperty (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi applicabili all'elemento EndProperty :

Nome attributo Obbligatorio valore
Nome Nome dell'entità finale dell'associazione di cui è in corso il mapping.

Esempio

Nell'esempio seguente viene illustrato un elemento AssociationSetMapping in cui viene mappata l'associazione FK_Course_Department nel modello concettuale alla tabella Course del database. I mapping tra le proprietà del tipo di associazione e le colonne di tabella vengono specificati negli elementi EndProperty figlio.

 <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>
 </AssociationSetMapping>

Esempio

Nell'esempio seguente viene illustrato l'elemento EndProperty che esegue il mapping delle funzioni di inserimento ed eliminazione di un'associazione (CourseInstructor) alle stored procedure nel database sottostante. Le funzioni a cui viene eseguito il mapping vengono dichiarate nel modello di archiviazione.

 <AssociationSetMapping Name="CourseInstructor"
                        TypeName="SchoolModel.CourseInstructor"
                        StoreEntitySet="CourseInstructor">
   <EndProperty Name="Person">
     <ScalarProperty Name="PersonID" ColumnName="PersonID" />
   </EndProperty>
   <EndProperty Name="Course">
     <ScalarProperty Name="CourseID" ColumnName="CourseID" />
   </EndProperty>
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >   
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </InsertFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </DeleteFunction>
   </ModificationFunctionMapping>
 </AssociationSetMapping>

Elemento EntityContainerMapping (MSL)

L'elemento EntityContainerMapping nel linguaggio msl (mapping specification language) esegue il mapping del contenitore di entità nel modello concettuale al contenitore di entità nel modello di archiviazione. L'elemento EntityContainerMapping è un elemento figlio dell'elemento Mapping.

L'elemento EntityContainerMapping può avere gli elementi figlio seguenti (nell'ordine elencato):

  • EntitySetMapping (zero o più)
  • AssociationSetMapping (zero o più)
  • FunctionImportMapping (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento EntityContainerMapping .

Nome attributo Obbligatorio Valore
Archiviazione ModelContainer Nome del contenitore di entità del modello di archiviazione di cui è in corso il mapping.
CdmEntityContainer Nome del contenitore di entità del modello concettuale di cui è in corso il mapping.
GenerateUpdateViews No True o False. Se False, non vengono generate visualizzazioni di aggiornamento. Questo attributo deve essere impostato su False quando si dispone di un mapping di sola lettura non valido perché i dati potrebbero non essere completati correttamente.
Il valore predefinito è True.

Esempio

L'esempio seguente mostra un elemento EntityContainerMapping che esegue il mapping del contenitore SchoolModelEntities (contenitore di entità modello concettuale) al contenitore SchoolModelStoreContainer (contenitore di entità del modello di archiviazione):

 <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
                         CdmEntityContainer="SchoolModelEntities">
   <EntitySetMapping Name="Courses">
     <EntityTypeMapping TypeName="c.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="c.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>

Elemento EntitySetMapping (MSL)

L'elemento EntitySetMapping nel linguaggio MSL (Mapping Specification Language) esegue il mapping di tutti i tipi di un set di entità modello concettuale ai set di entità nel modello di archiviazione. Un set di entità nel modello concettuale è un contenitore logico per le istanze di entità dello stesso tipo (e tipi derivati). Un set di entità nel modello di archiviazione rappresenta una tabella o una vista nel database sottostante. Il set di entità del modello concettuale viene specificato dal valore dell'attributo Name dell'elemento EntitySetMapping . La tabella o la vista mappata a viene specificata dall'attributo StoreEntitySet in ogni elemento MappingFragment figlio o nell'elemento EntitySetMapping stesso.

L'elemento EntitySetMapping può avere gli elementi figlio seguenti:

  • EntityTypeMapping (zero o più)
  • QueryView (zero o uno)
  • MappingFragment (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento EntitySetMapping .

Nome attributo Obbligatorio valore
Nome Nome del set di entità del modello concettuale di cui è in corso il mapping.
TypeName1 No Nome del tipo di entità del modello concettuale di cui è in corso il mapping.
StoreEntitySet1 No Nome del set di entità del modello di archiviazione a cui viene eseguito il mapping.
MakeColumnsDistinct No True o False a seconda che vengano restituite solo righe distinte.
Se questo attributo è impostato su True, l'attributo GenerateUpdateViews dell'elemento EntityContainerMapping deve essere impostato su False.

 

1 Gli attributi TypeName e StoreEntitySet possono essere usati al posto degli elementi figlio EntityTypeMapping e MappingFragment per eseguire il mapping di un singolo tipo di entità a una singola tabella.

Esempio

Nell'esempio seguente viene illustrato un elemento EntitySetMapping che esegue il mapping di tre tipi (un tipo di base e due tipi derivati) nel set di entità Courses del modello concettuale a tre tabelle diverse nel database sottostante. Le tabelle vengono specificate dall'attributo StoreEntitySet in ogni elemento MappingFragment .

 <EntitySetMapping Name="Courses">
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel1.Course)">
     <MappingFragment StoreEntitySet="Course">
       <ScalarProperty Name="CourseID" ColumnName="CourseID" />
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
       <ScalarProperty Name="Credits" ColumnName="Credits" />
       <ScalarProperty Name="Title" ColumnName="Title" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel1.OnlineCourse)">
     <MappingFragment StoreEntitySet="OnlineCourse">
       <ScalarProperty Name="CourseID" ColumnName="CourseID" />
       <ScalarProperty Name="URL" ColumnName="URL" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel1.OnsiteCourse)">
     <MappingFragment StoreEntitySet="OnsiteCourse">
       <ScalarProperty Name="CourseID" ColumnName="CourseID" />
       <ScalarProperty Name="Time" ColumnName="Time" />
       <ScalarProperty Name="Days" ColumnName="Days" />
       <ScalarProperty Name="Location" ColumnName="Location" />
     </MappingFragment>
   </EntityTypeMapping>
 </EntitySetMapping>

Elemento EntityTypeMapping (MSL)

L'elemento EntityTypeMapping nel linguaggio MSL (Mapping Specification Language) definisce il mapping tra un tipo di entità nel modello concettuale e tabelle o viste nel database sottostante. Per informazioni sui tipi di entità del modello concettuale e sulle tabelle o viste di database sottostanti, vedere Elemento EntityType (CSDL) e Elemento EntitySet (SSDL). Il tipo di entità del modello concettuale di cui viene eseguito il mapping viene specificato dall'attributo TypeName dell'elemento EntityTypeMapping . La tabella o la vista di cui viene eseguito il mapping viene specificata dall'attributo StoreEntitySet dell'elemento MappingFragment figlio.

L'elemento figlio ModificationFunctionMapping può essere usato per eseguire il mapping delle funzioni di inserimento, aggiornamento o eliminazione di tipi di entità alle stored procedure nel database.

L'elemento EntityTypeMapping può avere gli elementi figlio seguenti:

  • MappingFragment (zero o più)
  • ModificationFunctionMapping (zero o uno)
  • ScalarProperty
  • Condizione

Nota

Gli elementi MappingFragment e ModificationFunctionMapping non possono essere elementi figlio dell'elemento EntityTypeMapping contemporaneamente.

Nota

Gli elementi ScalarProperty e Condition possono essere solo elementi figlio dell'elemento EntityTypeMapping quando viene utilizzato all'interno di un elemento FunctionImportMapping.

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento EntityTypeMapping .

Nome attributo Obbligatorio Valore
Typename Nome completo dello spazio dei nomi del tipo di entità del modello concettuale di cui è in corso il mapping.
Se il tipo è astratto o un tipo derivato, il valore deve essere IsOfType(Namespace-qualified_type_name).

Esempio

Nell'esempio seguente viene illustrato un elemento EntitySetMapping con due elementi EntityTypeMapping figlio. Nel primo elemento EntityTypeMapping il tipo di entità SchoolModel.Person viene mappato alla tabella Person . Nel secondo elemento EntityTypeMapping , la funzionalità di aggiornamento del tipo SchoolModel.Person viene mappata a una stored procedure, UpdatePerson, nel database.

 <EntitySetMapping Name="People">
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="LastName" ColumnName="LastName" />
       <ScalarProperty Name="FirstName" ColumnName="FirstName" />
       <ScalarProperty Name="HireDate" ColumnName="HireDate" />
       <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <ModificationFunctionMapping>
       <UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
         <ScalarProperty Name="EnrollmentDate" ParameterName="EnrollmentDate"
                         Version="Current" />
         <ScalarProperty Name="HireDate" ParameterName="HireDate"
                         Version="Current" />
         <ScalarProperty Name="FirstName" ParameterName="FirstName"
                         Version="Current" />
         <ScalarProperty Name="LastName" ParameterName="LastName"
                         Version="Current" />
         <ScalarProperty Name="PersonID" ParameterName="PersonID"
                         Version="Current" />
       </UpdateFunction>
     </ModificationFunctionMapping>
   </EntityTypeMapping>
 </EntitySetMapping>

Esempio

Nell'esempio successivo viene mostrato il mapping di una gerarchia di tipo in cui il tipo radice è astratto. Si noti l'uso della IsOfType sintassi per gli attributi TypeName .

 <EntitySetMapping Name="People">
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="FirstName" ColumnName="FirstName" />
       <ScalarProperty Name="LastName" ColumnName="LastName" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="HireDate" ColumnName="HireDate" />
       <Condition ColumnName="HireDate" IsNull="false" />
       <Condition ColumnName="EnrollmentDate" IsNull="true" />
     </MappingFragment>
   </EntityTypeMapping>
   <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Student)">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="EnrollmentDate"
                       ColumnName="EnrollmentDate" />
       <Condition ColumnName="EnrollmentDate" IsNull="false" />
       <Condition ColumnName="HireDate" IsNull="true" />
     </MappingFragment>
   </EntityTypeMapping>
 </EntitySetMapping>

Elemento FunctionImportMapping (MSL)

L'elemento FunctionImportMapping nel linguaggio MSL (Mapping Specification Language) definisce il mapping tra un'importazione di funzioni nel modello concettuale e una stored procedure o una funzione nel database sottostante. Le importazioni di funzioni devono essere dichiarate nel modello concettuale mentre le stored procedure nel modello di archiviazione. Per altre informazioni, vedere Elemento FunctionImport (CSDL) e Elemento Function (SSDL).

Nota

Per impostazione predefinita, se un'importazione di funzioni restituisce un tipo di entità del modello concettuale o un tipo complesso, i nomi delle colonne restituiti dalla stored procedure sottostante devono corrispondere esattamente ai nomi delle proprietà nel tipo di modello concettuale. Se i nomi delle colonne non corrispondono esattamente ai nomi delle proprietà, il mapping deve essere definito in un elemento ResultMapping.

L'elemento FunctionImportMapping può avere gli elementi figlio seguenti:

  • ResultMapping (zero o più)

Attributi applicabili

La tabella seguente descrive gli attributi applicabili all'elemento FunctionImportMapping :

Nome attributo Obbligatorio Valore
FunctionImportName Nome dell'importazione di funzioni nel modello concettuale di cui è in corso il mapping.
Functionname Nome completo dello spazio dei nomi della funzione nel modello di archiviazione di cui è in corso il mapping.

Esempio

L'esempio seguente si basa sul modello School. Si consideri la funzione seguente nel modello di archiviazione:

 <Function Name="GetStudentGrades" Aggregate="false"
           BuiltIn="false" NiladicFunction="false"
           IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion"
           Schema="dbo">
   <Parameter Name="StudentID" Type="int" Mode="In" />
 </Function>

Si consideri anche questa importazione di funzioni nel modello concettuale:

 <FunctionImport Name="GetStudentGrades" EntitySet="StudentGrades"
                 ReturnType="Collection(SchoolModel.StudentGrade)">
   <Parameter Name="StudentID" Mode="In" Type="Int32" />
 </FunctionImport>

L'esempio seguente mostra un elemento FunctionImportMapping usato per eseguire il mapping tra la funzione e l'importazione di funzioni sopra l'una all'altra:

 <FunctionImportMapping FunctionImportName="GetStudentGrades"
                        FunctionName="SchoolModel.Store.GetStudentGrades" />

 

Elemento InsertFunction (MSL)

L'elemento InsertFunction nel linguaggio MSL (Mapping Specification Language) esegue il mapping della funzione di inserimento di un tipo di entità o di un'associazione nel modello concettuale a una stored procedure nel database sottostante. Le stored procedure a cui le funzioni di modifica sono mappate devono essere dichiarate nel modello di archiviazione. Per altre informazioni, vedere Elemento Function (SSDL).

Nota

Se non si esegue il mapping di tutte e tre le operazioni di inserimento, aggiornamento o eliminazione di un tipo di entità alle stored procedure, le operazioni non mappate avranno esito negativo se eseguite in fase di esecuzione e viene generata un'eccezione UpdateException.

L'elemento InsertFunction può essere figlio dell'elemento ModificationFunctionMapping e applicato all'elemento EntityTypeMapping o all'elemento AssociationSetMapping.

InsertFunction applicato a EntityTypeMapping

Se applicato all'elemento EntityTypeMapping, l'elemento InsertFunction esegue il mapping della funzione insert di un tipo di entità nel modello concettuale a una stored procedure.

L'elemento InsertFunction può avere gli elementi figlio seguenti quando applicati a un elemento EntityTypeMapping :

  • AssociationEnd (zero o più)
  • ComplexProperty (zero o più)
  • ResultBinding (zero o uno)
  • ScalarProperty (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento InsertFunction quando vengono applicati a un elemento EntityTypeMapping .

Nome attributo Obbligatorio Valore
Functionname Nome completo dello spazio dei nomi della stored procedure a cui la funzione di inserimento viene mappata. La stored procedure deve essere dichiarata nel modello di archiviazione.
RowsAffectedParameter No Nome del parametro di output che restituisce il numero di righe interessate.

Esempio

L'esempio seguente si basa sul modello School e mostra l'elemento InsertFunction usato per eseguire il mapping della funzione di inserimento del tipo di entità Person alla stored procedure InsertPerson. La stored procedure InsertPerson viene dichiarata nel modello di archiviazione.

 <EntityTypeMapping TypeName="SchoolModel.Person">
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
       <ScalarProperty Name="EnrollmentDate"
                       ParameterName="EnrollmentDate" />
       <ScalarProperty Name="HireDate" ParameterName="HireDate" />
       <ScalarProperty Name="FirstName" ParameterName="FirstName" />
       <ScalarProperty Name="LastName" ParameterName="LastName" />
       <ResultBinding Name="PersonID" ColumnName="NewPersonID" />
     </InsertFunction>
     <UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
       <ScalarProperty Name="EnrollmentDate"
                       ParameterName="EnrollmentDate"
                       Version="Current" />
       <ScalarProperty Name="HireDate" ParameterName="HireDate"
                       Version="Current" />
       <ScalarProperty Name="FirstName" ParameterName="FirstName"
                       Version="Current" />
       <ScalarProperty Name="LastName" ParameterName="LastName"
                       Version="Current" />
       <ScalarProperty Name="PersonID" ParameterName="PersonID"
                       Version="Current" />
     </UpdateFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
       <ScalarProperty Name="PersonID" ParameterName="PersonID" />
     </DeleteFunction>
   </ModificationFunctionMapping>
 </EntityTypeMapping>

InsertFunction applicato ad AssociationSetMapping

Se applicato all'elemento AssociationSetMapping, l'elemento InsertFunction esegue il mapping della funzione insert di un'associazione nel modello concettuale a una stored procedure.

L'elemento InsertFunction può avere gli elementi figlio seguenti quando viene applicato all'elemento AssociationSetMapping :

  • EndProperty

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento InsertFunction quando viene applicato all'elemento AssociationSetMapping .

Nome attributo Obbligatorio Valore
Functionname Nome completo dello spazio dei nomi della stored procedure a cui la funzione di inserimento viene mappata. La stored procedure deve essere dichiarata nel modello di archiviazione.
RowsAffectedParameter No Nome del parametro di output che restituisce il numero di righe interessate.

Esempio

L'esempio seguente si basa sul modello School e mostra l'elemento InsertFunction usato per eseguire il mapping della funzione insert dell'associazione CourseInstructor alla stored procedure InsertCourseInstructor. La stored procedure InsertCourseInstructor viene dichiarata nel modello di archiviazione.

 <AssociationSetMapping Name="CourseInstructor"
                        TypeName="SchoolModel.CourseInstructor"
                        StoreEntitySet="CourseInstructor">
   <EndProperty Name="Person">
     <ScalarProperty Name="PersonID" ColumnName="PersonID" />
   </EndProperty>
   <EndProperty Name="Course">
     <ScalarProperty Name="CourseID" ColumnName="CourseID" />
   </EndProperty>
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >   
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </InsertFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </DeleteFunction>
   </ModificationFunctionMapping>
 </AssociationSetMapping>

Elemento Mapping (MSL)

L'elemento Mapping nel linguaggio MSL (Mapping Specification Language) contiene informazioni per il mapping di oggetti definiti in un modello concettuale a un database (come descritto in un modello di archiviazione). Per altre informazioni, vedere Specifica CSDL e specifica SSDL.

L'elemento Mapping è l'elemento radice per una specifica di mapping. Lo spazio dei nomi XML per le specifiche di mapping è https://schemas.microsoft.com/ado/2009/11/mapping/cs.

L'elemento Mapping può includere i seguenti elementi figlio (nell'ordine elencato):

  • Alias (zero o più)
  • EntityContainerMapping (esattamente uno)

I nomi di tipi di modelli concettuale e di archiviazione a cui viene fatto riferimento in MSL devono essere qualificati dai rispettivi nomi dello spazio dei nomi. Per informazioni sul nome dello spazio dei nomi del modello concettuale, vedere Elemento schema (CSDL). Per informazioni sul nome dello spazio dei nomi del modello di archiviazione, vedere Elemento schema (SSDL). Gli alias per gli spazi dei nomi usati in MSL possono essere definiti con l'elemento Alias.

Attributi applicabili

La tabella seguente descrive gli attributi che possono essere applicati all'elemento Mapping .

Nome attributo Obbligatorio Valore
Space C-S. Si tratta di un valore fisso e non può essere modificato.

Esempio

Nell'esempio seguente viene illustrato un elemento Mapping basato su parte del modello School. Per altre informazioni sul modello School, vedere Avvio rapido (Entity Framework):

 <Mapping Space="C-S"
          xmlns="https://schemas.microsoft.com/ado/2009/11/mapping/cs">
   <Alias Key="c" Value="SchoolModel"/>
   <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
                           CdmEntityContainer="SchoolModelEntities">
     <EntitySetMapping Name="Courses">
       <EntityTypeMapping TypeName="c.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="c.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>

Elemento MappingFragment (MSL)

L'elemento MappingFragment nel linguaggio MSL (Mapping Specification Language) definisce il mapping tra le proprietà di un tipo di entità modello concettuale e una tabella o vista nel database. Per informazioni sui tipi di entità del modello concettuale e sulle tabelle o viste di database sottostanti, vedere Elemento EntityType (CSDL) e Elemento EntitySet (SSDL). MappingFragment può essere un elemento figlio dell'elemento EntityTypeMapping o dell'elemento EntitySetMapping.

L'elemento MappingFragment può avere gli elementi figlio seguenti:

  • ComplexType (zero o più)
  • ScalarProperty (zero o più)
  • Condizione (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento MappingFragment .

Nome attributo Obbligatorio Valore
StoreEntitySet Nome della tabella o visualizzazione di cui è in corso il mapping.
MakeColumnsDistinct No True o False a seconda che vengano restituite solo righe distinte.
Se questo attributo è impostato su True, l'attributo GenerateUpdateViews dell'elemento EntityContainerMapping deve essere impostato su False.

Esempio

Nell'esempio seguente viene illustrato un elemento MappingFragment come elemento figlio di un elemento EntityTypeMapping . In questo esempio, le proprietà del tipo Course nel modello concettuale vengono mappate alle colonne della tabella Course nel database.

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

Esempio

Nell'esempio seguente viene illustrato un elemento MappingFragment come elemento figlio di un elemento EntitySetMapping . Come nell'esempio precedente, le proprietà del tipo Course nel modello concettuale vengono mappate alle colonne della tabella Course nel database.

 <EntitySetMapping Name="Courses" 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>
 </EntitySetMapping>

Elemento ModificationFunctionMapping (MSL)

L'elemento ModificationFunctionMapping nel linguaggio MSL (Mapping Specification Language) esegue il mapping delle funzioni di inserimento, aggiornamento ed eliminazione di un tipo di entità modello concettuale alle stored procedure nel database sottostante. L'elemento ModificationFunctionMapping può anche eseguire il mapping delle funzioni di inserimento ed eliminazione per le associazioni molti-a-molti nel modello concettuale alle stored procedure nel database sottostante. Le stored procedure a cui le funzioni di modifica sono mappate devono essere dichiarate nel modello di archiviazione. Per altre informazioni, vedere Elemento Function (SSDL).

Nota

Se non si esegue il mapping di tutte e tre le operazioni di inserimento, aggiornamento o eliminazione di un tipo di entità alle stored procedure, le operazioni non mappate avranno esito negativo se eseguite in fase di esecuzione e viene generata un'eccezione UpdateException.

Nota

Se esiste un mapping tra le funzioni di modifica per un'entità in una gerarchia di ereditarietà e stored procedure, è necessario eseguire il mapping delle funzioni di modifica per tutti i tipi nella gerarchia a stored procedure.

L'elemento ModificationFunctionMapping può essere figlio dell'elemento EntityTypeMapping o dell'elemento AssociationSetMapping.

L'elemento ModificationFunctionMapping può avere gli elementi figlio seguenti:

  • DeleteFunction (zero o uno)
  • InsertFunction (zero o uno)
  • UpdateFunction (zero o uno)

Nessun attributo è applicabile all'elemento ModificationFunctionMapping .

Esempio

Nell'esempio seguente viene illustrato il mapping del set di entità per il set di entità Persone nel modello School. Oltre al mapping delle colonne per il tipo di entità Person , viene visualizzato il mapping delle funzioni di inserimento, aggiornamento ed eliminazione del tipo Person . Le funzioni a cui viene eseguito il mapping vengono dichiarate nel modello di archiviazione.

 <EntitySetMapping Name="People">
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="LastName" ColumnName="LastName" />
       <ScalarProperty Name="FirstName" ColumnName="FirstName" />
       <ScalarProperty Name="HireDate" ColumnName="HireDate" />
       <ScalarProperty Name="EnrollmentDate"
                       ColumnName="EnrollmentDate" />
     </MappingFragment>
 </EntityTypeMapping>
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <ModificationFunctionMapping>
       <InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
         <ScalarProperty Name="EnrollmentDate"
                         ParameterName="EnrollmentDate" />
         <ScalarProperty Name="HireDate" ParameterName="HireDate" />
         <ScalarProperty Name="FirstName" ParameterName="FirstName" />
         <ScalarProperty Name="LastName" ParameterName="LastName" />
         <ResultBinding Name="PersonID" ColumnName="NewPersonID" />
       </InsertFunction>
       <UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
         <ScalarProperty Name="EnrollmentDate"
                         ParameterName="EnrollmentDate"
                         Version="Current" />
         <ScalarProperty Name="HireDate" ParameterName="HireDate"
                         Version="Current" />
         <ScalarProperty Name="FirstName" ParameterName="FirstName"
                         Version="Current" />
         <ScalarProperty Name="LastName" ParameterName="LastName"
                         Version="Current" />
         <ScalarProperty Name="PersonID" ParameterName="PersonID"
                         Version="Current" />
       </UpdateFunction>
       <DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
         <ScalarProperty Name="PersonID" ParameterName="PersonID" />
       </DeleteFunction>
     </ModificationFunctionMapping>
   </EntityTypeMapping>
 </EntitySetMapping>

Esempio

Nell'esempio seguente viene illustrato il mapping del set di associazioni per l'associazione CourseInstructor impostato nel modello School. Oltre al mapping delle colonne per l'associazione CourseInstructor , vengono visualizzati il mapping delle funzioni di inserimento ed eliminazione dell'associazione CourseInstructor . Le funzioni a cui viene eseguito il mapping vengono dichiarate nel modello di archiviazione.

 <AssociationSetMapping Name="CourseInstructor"
                        TypeName="SchoolModel.CourseInstructor"
                        StoreEntitySet="CourseInstructor">
   <EndProperty Name="Person">
     <ScalarProperty Name="PersonID" ColumnName="PersonID" />
   </EndProperty>
   <EndProperty Name="Course">
     <ScalarProperty Name="CourseID" ColumnName="CourseID" />
   </EndProperty>
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >   
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </InsertFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </DeleteFunction>
   </ModificationFunctionMapping>
 </AssociationSetMapping>

 

 

Elemento QueryView (MSL)

L'elemento QueryView nel linguaggio MSL (Mapping Specification Language) definisce un mapping di sola lettura tra un tipo di entità o un'associazione nel modello concettuale e una tabella nel database sottostante. Il mapping viene definito con una query Entity SQL valutata rispetto al modello di archiviazione ed è possibile esprimere il set di risultati in termini di entità o associazione nel modello concettuale. Poiché le visualizzazioni di query sono di sola lettura, non è possibile utilizzare comandi di aggiornamento standard per aggiornare i tipi definiti da tali visualizzazioni. A tale scopo è possibile utilizzare le funzioni di modifica. Per altre informazioni, vedere Procedura: Eseguire il mapping delle funzioni di modifica alle stored procedure.

Nota

Nell'elemento QueryView le espressioni Entity SQL che contengono GroupBy, aggregazioni di gruppi o proprietà di navigazione non sono supportate.

 

L'elemento QueryView può essere figlio dell'elemento EntitySetMapping o dell'elemento AssociationSetMapping. Nel primo caso, la visualizzazione di query definisce un mapping di sola lettura per un'entità nel modello concettuale. Nel secondo caso, la visualizzazione di query definisce un mapping di sola lettura per un'associazione nel modello concettuale.

Nota

Se l'elemento AssociationSetMapping è relativo a un'associazione con un vincolo referenziale, l'elemento AssociationSetMapping viene ignorato. Per altre informazioni, vedere Elemento ReferialConstraint (CSDL).

L'elemento QueryView non può contenere elementi figlio.

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento QueryView .

Nome attributo Obbligatorio Valore
Typename No Nome del tipo di modello concettuale mappato dalla visualizzazione di query.

Esempio

Nell'esempio seguente viene illustrato l'elemento QueryView come elemento figlio dell'elemento EntitySetMapping e viene definito un mapping di visualizzazione query per il tipo di entità Department nel modello school.

 <EntitySetMapping Name="Departments" >
   <QueryView>
     SELECT VALUE SchoolModel.Department(d.DepartmentID,
                                         d.Name,
                                         d.Budget,
                                         d.StartDate)
     FROM SchoolModelStoreContainer.Department AS d
     WHERE d.Budget > 150000
   </QueryView>
 </EntitySetMapping>

Poiché la query restituisce solo un subset dei membri del tipo Department nel modello di archiviazione, il tipo Department nel modello School è stato modificato in base a questo mapping come indicato di seguito:

 <EntityType Name="Department">
   <Key>
     <PropertyRef Name="DepartmentID" />
   </Key>
   <Property Type="Int32" Name="DepartmentID" Nullable="false" />
   <Property Type="String" Name="Name" Nullable="false"
             MaxLength="50" FixedLength="false" Unicode="true" />
   <Property Type="Decimal" Name="Budget" Nullable="false"
             Precision="19" Scale="4" />
   <Property Type="DateTime" Name="StartDate" Nullable="false" />
   <NavigationProperty Name="Courses"
                       Relationship="SchoolModel.FK_Course_Department"
                       FromRole="Department" ToRole="Course" />
 </EntityType>

Esempio

Nell'esempio seguente viene illustrato l'elemento QueryView come figlio di un elemento AssociationSetMapping e viene definito un mapping di sola lettura per l'associazione FK_Course_Department nel modello School.

 <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
                         CdmEntityContainer="SchoolEntities">
   <EntitySetMapping Name="Courses" >
     <QueryView>
       SELECT VALUE SchoolModel.Course(c.CourseID,
                                       c.Title,
                                       c.Credits)
       FROM SchoolModelStoreContainer.Course AS c
     </QueryView>
   </EntitySetMapping>
   <EntitySetMapping Name="Departments" >
     <QueryView>
       SELECT VALUE SchoolModel.Department(d.DepartmentID,
                                           d.Name,
                                           d.Budget,
                                           d.StartDate)
       FROM SchoolModelStoreContainer.Department AS d
       WHERE d.Budget > 150000
     </QueryView>
   </EntitySetMapping>
   <AssociationSetMapping Name="FK_Course_Department" >
     <QueryView>
       SELECT VALUE SchoolModel.FK_Course_Department(
         CREATEREF(SchoolEntities.Departments, row(c.DepartmentID), SchoolModel.Department),
         CREATEREF(SchoolEntities.Courses, row(c.CourseID)) )
       FROM SchoolModelStoreContainer.Course AS c
     </QueryView>
   </AssociationSetMapping>
 </EntityContainerMapping>

 

Commenti

È possibile definire le visualizzazioni di query per consentire gli scenari seguenti:

  • Definire un'entità nel modello concettuale che non includa tutte le proprietà dell'entità nel modello di archiviazione. Sono incluse le proprietà che non hanno valori predefiniti e che non supportano valori Null .
  • Eseguire il mapping delle colonne calcolate nel modello di archiviazione alle proprietà dei tipi di entità nel modello concettuale.
  • Definire un mapping in cui le condizioni utilizzate per partizionare le entità nel modello concettuale non siano basate sull'uguaglianza. Quando si specifica un mapping condizionale usando l'elemento Condition , la condizione specificata deve essere uguale al valore specificato. Per altre informazioni, vedere Elemento Condition (MSL).
  • Eseguire il mapping della stessa colonna nel modello di archiviazione a più tipi nel modello concettuale.
  • Eseguire il mapping di più tipi alla stessa tabella.
  • Definire associazioni nel modello concettuale che non siano basate sulle chiavi esterne dello schema relazionale.
  • Utilizzare la logica di business personalizzata per impostare il valore delle proprietà nel modello concettuale. Ad esempio, è possibile eseguire il mapping del valore stringa "T" nell'origine dati a un valore true, un valore booleano, nel modello concettuale.
  • Definire filtri condizionali per i risultati della query.
  • Applicare ai dati del modello concettuale un numero di restrizioni minore di quelle applicate al modello di archiviazione. Ad esempio, è possibile rendere nullable una proprietà nel modello concettuale anche se la colonna a cui è mappato non supporta valori Null.

Le considerazioni seguenti riguardano la definizione delle visualizzazioni di query per le entità:

  • Le visualizzazioni di query sono di sola lettura. È possibile applicare aggiornamenti alle entità solo utilizzando le funzioni di modifica.
  • Quando viene definito un tipo di entità da una visualizzazione di query, è necessario definire anche tutte le entità correlate dalle visualizzazioni di query.
  • Quando si esegue il mapping di un'associazione molti-a-molti a un'entità nel modello di archiviazione che rappresenta una tabella di collegamento nello schema relazionale, è necessario definire un elemento QueryView nell'elemento AssociationSetMapping per questa tabella di collegamento.
  • È necessario definire le visualizzazioni di query per tutti i tipi di una gerarchia di tipi. Puoi eseguire quanto sopra nei modi seguenti:
    • Con un singolo elemento QueryView che specifica una singola query Entity SQL che restituisce un'unione di tutti i tipi di entità nella gerarchia.
    • Con un singolo elemento QueryView che specifica una singola query Entity SQL che usa l'operatore CA edizione Standard per restituire un tipo di entità specifico nella gerarchia in base a una condizione specifica.
    • Con un elemento QueryView aggiuntivo per un tipo specifico nella gerarchia. In questo caso, usare l'attributo TypeName dell'elemento QueryView per specificare il tipo di entità per ogni visualizzazione.
  • Quando viene definita una visualizzazione query, non è possibile specificare l'attributo Archiviazione SetName nell'elemento EntitySetMapping.
  • Quando viene definita una visualizzazione query, l'elemento EntitySetMappingnon può contenere anche mapping delle proprietà .

Elemento ResultBinding (MSL)

L'elemento ResultBinding nel linguaggio msl (Mapping Specification Language) esegue il mapping dei valori delle colonne restituiti dalle stored procedure alle proprietà dell'entità nel modello concettuale quando le funzioni di modifica del tipo di entità vengono mappate alle stored procedure nel database sottostante. Ad esempio, quando il valore di una colonna Identity viene restituito da una stored procedure di inserimento, l'elemento ResultBinding esegue il mapping del valore restituito a una proprietà del tipo di entità nel modello concettuale.

L'elemento ResultBinding può essere figlio dell'elemento InsertFunction o dell'elemento UpdateFunction.

L'elemento ResultBinding non può contenere elementi figlio.

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi applicabili all'elemento ResultBinding :

Nome attributo Obbligatorio valore
Nome Nome della proprietà di entità nel modello concettuale di cui è in corso il mapping.
ColumnName Nome della colonna di cui viene eseguito il mapping.

Esempio

L'esempio seguente si basa sul modello School e mostra un elemento InsertFunction usato per eseguire il mapping della funzione di inserimento del tipo di entità Person alla stored procedure InsertPerson . (L'oggetto La stored procedure InsertPerson è illustrata di seguito e viene dichiarata nel modello di archiviazione. Un elemento ResultBinding viene usato per eseguire il mapping di un valore di colonna restituito dalla stored procedure (NewPersonID) a una proprietà del tipo di entità (PersonID).

 <EntityTypeMapping TypeName="SchoolModel.Person">
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
       <ScalarProperty Name="EnrollmentDate"
                       ParameterName="EnrollmentDate" />
       <ScalarProperty Name="HireDate" ParameterName="HireDate" />
       <ScalarProperty Name="FirstName" ParameterName="FirstName" />
       <ScalarProperty Name="LastName" ParameterName="LastName" />
       <ResultBinding Name="PersonID" ColumnName="NewPersonID" />
     </InsertFunction>
     <UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
       <ScalarProperty Name="EnrollmentDate"
                       ParameterName="EnrollmentDate"
                       Version="Current" />
       <ScalarProperty Name="HireDate" ParameterName="HireDate"
                       Version="Current" />
       <ScalarProperty Name="FirstName" ParameterName="FirstName"
                       Version="Current" />
       <ScalarProperty Name="LastName" ParameterName="LastName"
                       Version="Current" />
       <ScalarProperty Name="PersonID" ParameterName="PersonID"
                       Version="Current" />
     </UpdateFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
       <ScalarProperty Name="PersonID" ParameterName="PersonID" />
     </DeleteFunction>
   </ModificationFunctionMapping>
 </EntityTypeMapping>

Il codice Transact-SQL seguente descrive la stored procedure InsertPerson :

 CREATE PROCEDURE [dbo].[InsertPerson]
                                @LastName nvarchar(50),
                                @FirstName nvarchar(50),
                                @HireDate datetime,
                                @EnrollmentDate datetime
                                AS
                                INSERT INTO dbo.Person (LastName,
                                                                             FirstName,
                                                                             HireDate,
                                                                             EnrollmentDate)
                                VALUES (@LastName,
                                               @FirstName,
                                               @HireDate,
                                               @EnrollmentDate);
                                SELECT SCOPE_IDENTITY() as NewPersonID;

Elemento ResultMapping (MSL)

L'elemento ResultMapping nel linguaggio MSL (Mapping Specification Language) definisce il mapping tra un'importazione di funzioni nel modello concettuale e una stored procedure nel database sottostante quando sono vere le condizioni seguenti:

  • L'operazione di importazione di funzioni restituisce un tipo di entità del modello concettuale.
  • I nomi delle colonne restituite dalla stored procedure non corrispondono esattamente ai nomi delle proprietà del tipo di entità o del tipo complesso.

Per impostazione predefinita, il mapping tra le colonne restituite da una stored procedure e un tipo di entità o un tipo complesso è basato sui nomi delle colonne e delle proprietà. Se i nomi delle colonne non corrispondono esattamente ai nomi delle proprietà, è necessario utilizzare l'elemento ResultMapping per definire il mapping. Per un esempio del mapping predefinito, vedere Elemento FunctionImportMapping (MSL).

L'elemento ResultMapping è un elemento figlio dell'elemento FunctionImportMapping.

L'elemento ResultMapping può avere gli elementi figlio seguenti:

  • EntityTypeMapping (zero o più)
  • ComplexTypeMapping

Nessun attributo è applicabile all'elemento ResultMapping .

Esempio

Si consideri la stored procedure seguente:

 CREATE PROCEDURE [dbo].[GetGrades]
             @student_Id int
             AS
             SELECT     EnrollmentID as enroll_id,
                                                                             Grade as grade,
                                                                             CourseID as course_id,
                                                                             StudentID as student_id
                                               FROM dbo.StudentGrade
             WHERE StudentID = @student_Id

Si consideri inoltre il tipo di entità del modello concettuale seguente:

 <EntityType Name="StudentGrade">
   <Key>
     <PropertyRef Name="EnrollmentID" />
   </Key>
   <Property Name="EnrollmentID" Type="Int32" Nullable="false"
             annotation:StoreGeneratedPattern="Identity" />
   <Property Name="CourseID" Type="Int32" Nullable="false" />
   <Property Name="StudentID" Type="Int32" Nullable="false" />
   <Property Name="Grade" Type="Decimal" Precision="3" Scale="2" />
 </EntityType>

Per creare un'importazione di funzione che restituisce istanze del tipo di entità precedente, il mapping tra le colonne restituite dalla stored procedure e il tipo di entità deve essere definito in un elemento ResultMapping :

 <FunctionImportMapping FunctionImportName="GetGrades"
                        FunctionName="SchoolModel.Store.GetGrades" >
   <ResultMapping>
     <EntityTypeMapping TypeName="SchoolModel.StudentGrade">
       <ScalarProperty Name="EnrollmentID" ColumnName="enroll_id"/>
       <ScalarProperty Name="CourseID" ColumnName="course_id"/>
       <ScalarProperty Name="StudentID" ColumnName="student_id"/>
       <ScalarProperty Name="Grade" ColumnName="grade"/>
     </EntityTypeMapping>
   </ResultMapping>
 </FunctionImportMapping>

Elemento ScalarProperty (MSL)

L'elemento ScalarProperty nel linguaggio MSL (Mapping Specification Language) esegue il mapping di una proprietà su un tipo di entità modello concettuale, un tipo complesso o un'associazione a una colonna di tabella o un parametro di stored procedure nel database sottostante.

Nota

Le stored procedure a cui le funzioni di modifica sono mappate devono essere dichiarate nel modello di archiviazione. Per altre informazioni, vedere Elemento Function (SSDL).

L'elemento ScalarProperty può essere figlio degli elementi seguenti:

  • MappingFragment
  • InsertFunction
  • UpdateFunction
  • DeleteFunction
  • EndProperty
  • ComplexProperty
  • ResultMapping

Come elemento figlio dell'elemento MappingFragment, ComplexProperty o EndProperty, l'elemento ScalarProperty esegue il mapping di una proprietà nel modello concettuale a una colonna nel database. Come elemento figlio dell'elemento InsertFunction, UpdateFunction o DeleteFunction, l'elemento ScalarProperty esegue il mapping di una proprietà nel modello concettuale a un parametro di stored procedure.

L'elemento ScalarProperty non può contenere elementi figlio.

Attributi applicabili

Gli attributi che si applicano all'elemento ScalarProperty variano a seconda del ruolo dell'elemento.

Nella tabella seguente vengono descritti gli attributi applicabili quando l'elemento ScalarProperty viene usato per eseguire il mapping di una proprietà del modello concettuale a una colonna nel database:

Nome attributo Obbligatorio valore
Nome Nome della proprietà del modello concettuale di cui è in corso il mapping.
ColumnName Nome della colonna della tabella di cui è in corso il mapping.

Nella tabella seguente vengono descritti gli attributi applicabili all'elemento ScalarProperty quando viene usato per eseguire il mapping di una proprietà del modello concettuale a un parametro della stored procedure:

Nome attributo Obbligatorio valore
Nome Nome della proprietà del modello concettuale di cui è in corso il mapping.
ParameterName Nome del parametro di cui è in corso il mapping.
Versione No Corrente o Originale a seconda che il valore corrente o il valore originale della proprietà debba essere utilizzato per i controlli di concorrenza.

Esempio

L'esempio seguente mostra l'elemento ScalarProperty usato in due modi:

  • Per eseguire il mapping delle proprietà del tipo di entità Person alle colonne della tabella Person.
  • Per eseguire il mapping delle proprietà del tipo di entità Person ai parametri della stored procedure UpdatePerson. Le stored procedure vengono dichiarate nel modello di archiviazione.
 <EntitySetMapping Name="People">
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <MappingFragment StoreEntitySet="Person">
       <ScalarProperty Name="PersonID" ColumnName="PersonID" />
       <ScalarProperty Name="LastName" ColumnName="LastName" />
       <ScalarProperty Name="FirstName" ColumnName="FirstName" />
       <ScalarProperty Name="HireDate" ColumnName="HireDate" />
       <ScalarProperty Name="EnrollmentDate"
                       ColumnName="EnrollmentDate" />
     </MappingFragment>
 </EntityTypeMapping>
   <EntityTypeMapping TypeName="SchoolModel.Person">
     <ModificationFunctionMapping>
       <InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
         <ScalarProperty Name="EnrollmentDate"
                         ParameterName="EnrollmentDate" />
         <ScalarProperty Name="HireDate" ParameterName="HireDate" />
         <ScalarProperty Name="FirstName" ParameterName="FirstName" />
         <ScalarProperty Name="LastName" ParameterName="LastName" />
         <ResultBinding Name="PersonID" ColumnName="NewPersonID" />
       </InsertFunction>
       <UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
         <ScalarProperty Name="EnrollmentDate"
                         ParameterName="EnrollmentDate"
                         Version="Current" />
         <ScalarProperty Name="HireDate" ParameterName="HireDate"
                         Version="Current" />
         <ScalarProperty Name="FirstName" ParameterName="FirstName"
                         Version="Current" />
         <ScalarProperty Name="LastName" ParameterName="LastName"
                         Version="Current" />
         <ScalarProperty Name="PersonID" ParameterName="PersonID"
                         Version="Current" />
       </UpdateFunction>
       <DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
         <ScalarProperty Name="PersonID" ParameterName="PersonID" />
       </DeleteFunction>
     </ModificationFunctionMapping>
   </EntityTypeMapping>
 </EntitySetMapping>

Esempio

Nell'esempio seguente viene illustrato l'elemento ScalarProperty utilizzato per eseguire il mapping delle funzioni di inserimento ed eliminazione di un'associazione di modelli concettuali alle stored procedure nel database. Le stored procedure vengono dichiarate nel modello di archiviazione.

 <AssociationSetMapping Name="CourseInstructor"
                        TypeName="SchoolModel.CourseInstructor"
                        StoreEntitySet="CourseInstructor">
   <EndProperty Name="Person">
     <ScalarProperty Name="PersonID" ColumnName="PersonID" />
   </EndProperty>
   <EndProperty Name="Course">
     <ScalarProperty Name="CourseID" ColumnName="CourseID" />
   </EndProperty>
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >   
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </InsertFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
       <EndProperty Name="Course">
         <ScalarProperty Name="CourseID" ParameterName="courseId"/>
       </EndProperty>
       <EndProperty Name="Person">
         <ScalarProperty Name="PersonID" ParameterName="instructorId"/>
       </EndProperty>
     </DeleteFunction>
   </ModificationFunctionMapping>
 </AssociationSetMapping>

Elemento UpdateFunction (MSL)

L'elemento UpdateFunction nel linguaggio MSL (Mapping Specification Language) esegue il mapping della funzione di aggiornamento di un tipo di entità nel modello concettuale a una stored procedure nel database sottostante. Le stored procedure a cui le funzioni di modifica sono mappate devono essere dichiarate nel modello di archiviazione. Per altre informazioni, vedere Elemento Function (SSDL).

Nota

Se non si esegue il mapping di tutte e tre le operazioni di inserimento, aggiornamento o eliminazione di un tipo di entità alle stored procedure, le operazioni non mappate avranno esito negativo se eseguite in fase di esecuzione e viene generata un'eccezione UpdateException.

L'elemento UpdateFunction può essere figlio dell'elemento ModificationFunctionMapping e applicato all'elemento EntityTypeMapping.

L'elemento UpdateFunction può avere gli elementi figlio seguenti:

  • AssociationEnd (zero o più)
  • ComplexProperty (zero o più)
  • ResultBinding (zero o uno)
  • ScalarProperty (zero o più)

Attributi applicabili

Nella tabella seguente vengono descritti gli attributi che possono essere applicati all'elemento UpdateFunction .

Nome attributo Obbligatorio Valore
Functionname Nome completo dello spazio dei nomi della stored procedure a cui la funzione di aggiornamento viene mappata. La stored procedure deve essere dichiarata nel modello di archiviazione.
RowsAffectedParameter No Nome del parametro di output che restituisce il numero di righe interessate.

Esempio

L'esempio seguente si basa sul modello School e mostra l'elemento UpdateFunction usato per eseguire il mapping della funzione di aggiornamento del tipo di entità Person alla stored procedure UpdatePerson. La stored procedure UpdatePerson viene dichiarata nel modello di archiviazione.

 <EntityTypeMapping TypeName="SchoolModel.Person">
   <ModificationFunctionMapping>
     <InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
       <ScalarProperty Name="EnrollmentDate"
                       ParameterName="EnrollmentDate" />
       <ScalarProperty Name="HireDate" ParameterName="HireDate" />
       <ScalarProperty Name="FirstName" ParameterName="FirstName" />
       <ScalarProperty Name="LastName" ParameterName="LastName" />
       <ResultBinding Name="PersonID" ColumnName="NewPersonID" />
     </InsertFunction>
     <UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
       <ScalarProperty Name="EnrollmentDate"
                       ParameterName="EnrollmentDate"
                       Version="Current" />
       <ScalarProperty Name="HireDate" ParameterName="HireDate"
                       Version="Current" />
       <ScalarProperty Name="FirstName" ParameterName="FirstName"
                       Version="Current" />
       <ScalarProperty Name="LastName" ParameterName="LastName"
                       Version="Current" />
       <ScalarProperty Name="PersonID" ParameterName="PersonID"
                       Version="Current" />
     </UpdateFunction>
     <DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
       <ScalarProperty Name="PersonID" ParameterName="PersonID" />
     </DeleteFunction>
   </ModificationFunctionMapping>
 </EntityTypeMapping>