MSL-Spezifikation

MSL (Mapping Specification Language) ist eine XML-basierte Sprache, welche die Zuordnung zwischen dem konzeptionellen Modell und dem Speichermodell einer Entity Framework-Anwendung beschreibt.

In einer Entity Framework-Anwendung werden Zuordnungsmetadaten zur Erstellungszeit aus einer MSL-Datei (die in MSL geschrieben ist) geladen. Entity Framework verwendet Metadaten über die Zuordnung zur Laufzeit, um Abfragen für das konzeptionelle Modell in datenspeicherspezifische Befehle zu übersetzen.

Der Entity Framework-Designer (EF-Designer) speichert Zuordnungsinformationen zur Entwurfszeit in einer EDMX-Datei. Zur Erstellungszeit verwendet der Entity-Designer die in einer EDMX-Datei gespeicherten Informationen, um die MSL-Datei zu erstellen, die zur Laufzeit vom Entity Framework benötigt wird

Namen aller konzeptionellen oder Speichermodelltypen, auf denen in MSL verwiesen wird, müssen mit dem jeweiligen Namespacenamen qualifiziert werden. Weitere Informationen zum Namespacenamen des konzeptionellen Modells finden Sie unter CSDL-Spezifikation. Weitere Informationen zum Namespacenamen des Speichermodells finden Sie unter SSDL-Spezifikation.

Die verschiedenen Versionen von MSL werden von XML-Namespaces unterschieden.

MSL-Version XML-Namespace
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

Alias-Element (MSL)

In MSL (Mapping Specification Language) ist das Alias-Element ein untergeordnetes Element des Mapping-Elements, das verwendet wird, um Aliase für konzeptionelle Modell- und Speichermodellnamespaces zu definieren. Namen aller konzeptionellen oder Speichermodelltypen, auf denen in MSL verwiesen wird, müssen mit dem jeweiligen Namespacenamen qualifiziert werden. Informationen zum Namespacenamen des konzeptionellen Modells finden Sie unter Schema-Element (CSDL). Informationen zum Namespacenamen des Speichermodells finden Sie unter Schema-Element (SSDL).

Das Alias-Element darf keine untergeordneten Elemente enthalten.

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die für das Alias-Element übernommen werden können.

Attributname Ist erforderlich Wert
Schlüssel Ja Der Alias für den Namespace, der durch das Wert-Attribut angegeben wird.
Wert Ja Der Namespace, für den der Wert des Schlüssel-Elements ein Alias ist.

Beispiel

Im folgenden Beispiel wird ein Alias-Element gezeigt, das den Alias c für Typen definiert, die im konzeptionellen Modell definiert werden.

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

AssociationEnd-Element (MSL)

Das AssociationEnd-Element der Mapping-Spezifikationssprache (MSL) wird verwendet, wenn die Änderungsfunktionen eines Entitätstyps im konzeptionellen Modell gespeicherten Prozeduren in der zugrunde liegenden Datenbank zugeordnet werden. Wenn eine gespeicherte Änderungsprozedur einen Parameter akzeptiert, dessen Wert in einer Zuordnungseigenschaft enthalten ist, ordnet das AssociationEnd-Element den Eigenschaftswert dem Parameter zu. Weitere Informationen finden Sie im untenstehenden Beispiel.

Weitere Informationen zum Zuordnen von Änderungsfunktionen von Entitätstypen zu gespeicherten Prozeduren finden Sie unter ModificationFunctionMapping Element (MSL) und Walkthrough: Zuordnen einer Entität zu gespeicherten Prozeduren.

Das AssociationEnd-Element kann die folgenden untergeordneten Elemente aufweisen:

  • ScalarProperty

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das AssociationEnd-Element anwendbar sind.

Attributname Ist erforderlich Wert
AssociationSet Ja Der Name der Zuordnung, die zugeordnet wird.
From Ja Der Wert des FromRole-Attributs der Navigationseigenschaft, die der Zuordnung entspricht, die zugeordnet wird. Weitere Informationen finden Sie unter NavigationProperty-Element (CSDL).
To Ja Der Wert des ToRole-Attributs der Navigationseigenschaft, die der Zuordnung entspricht, die zugeordnet wird. Weitere Informationen finden Sie unter NavigationProperty-Element (CSDL).

Beispiel

Betrachten Sie den folgenden Entitätstyp des konzeptionellen Modells:

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

Betrachten Sie auch die folgende gespeicherte Prozedur:

 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;

Um dieser gespeicherten Prozedur die Aktualisierungsfunktion der Course-Entität zuzuordnen, müssen Sie einen Wert für den DepartmentID-Parameter angeben. Der Wert für DepartmentID entspricht keiner Eigenschaft des Entitätstyps; er ist vielmehr in einer unabhängigen Zuordnung enthalten, deren Zuordnung hier angezeigt wird:

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

Der folgende Code zeigt das AssociationEnd-Element, das verwendet wird, um die DepartmentID-Eigenschaft der FK_Course_Department-Zuordnung zur gespeicherten UpdateCourse-Prozedur zuzuordnen (der die Updatefunktion des Course-Entitätstyps zugeordnet wird):

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

AssociationSetMapping-Element (MSL)

Das AssociationSetMapping-Element der Mapping-Spezifikationssprache (MSL) definiert, wie eine Zuordnung im konzeptionellen Modell den Tabellenspalten in der zugrunde liegenden Datenbank zugeordnet wird.

Zuordnungen im konzeptionellen Modell sind Typen, deren Eigenschaften Primär- und Fremdschlüsselspalten in der zugrunde liegenden Datenbank darstellen. Das AssociationSetMapping-Element definiert mithilfe von zwei EndProperty-Elementen, wie die Zuordnungstypeigenschaften den Spalten in der Datenbank zugeordnet werden. Sie können mit dem Condition-Element Bedingungen für diese Zuordnungen festlegen. Mit dem ModificationFunctionMapping-Element ordnen Sie Einfüge-, Update- und Löschfunktionen für Zuordnungen gespeicherten Prozeduren in der Datenbank zu. Definieren Sie mithilfe einer Entity SQL-Zeichenfolge in einem QueryView-Element schreibgeschützte Zuordnungen von Zuordnungen zu Tabellenspalten.

Hinweis

Wenn eine referenzielle Einschränkung für eine Zuordnung im konzeptionellen Modell definiert ist, muss diese Zuordnung nicht mit einem AssociationSetMapping-Element zugeordnet werden. Wenn ein AssociationSetMapping-Element für eine Zuordnung vorhanden ist, das eine referenzielle Einschränkung aufweist, werden die im AssociationSetMapping-Element definierten Zuordnungen ignoriert. Weitere Informationen finden Sie unter ReferentialConstraint-Element (CSDL).

Das AssociationSetMapping-Element kann die folgenden untergeordneten Elemente aufweisen

  • QueryView (keins oder eins)
  • EndProperty (keins oder zwei)
  • Condition (keins oder mehr)
  • ModificationFunctionMapping (keins oder eins)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das AssociationSetMapping-Element angewendet werden können.

Attributname Ist erforderlich Wert
Name Ja Der Name des konzeptionellen Modell-Zuordnungssatzes, der zugeordnet wird.
TypeName Nein Der mit einem Namespace qualifizierte Name des konzeptionellen Modell-Zuordnungstyps, der zugeordnet wird.
StoreEntitySet Nein Der Name der Tabelle, die zugeordnet wird.

Beispiel

Das folgende Beispiel zeigt ein AssociationSetMapping-Element, in dem der FK_Course_Department-Zuordnungssatz im konzeptionellen Modell der Kurstabelle in der Datenbank zugeordnet ist. Zuordnungen von Zuordnungstypeigenschaften zu Tabellenspalten werden in untergeordneten EndProperty-Elementen angegeben.

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

ComplexProperty-Element (MSL)

Das ComplexProperty-Element der Mapping-Spezifikationssprache (MSL) definiert die Zuordnung einer komplexen Typeigenschaft eines Entitätstyp des konzeptionellen Modells zu den Tabellenspalten in der zugrunde liegenden Datenbank. Die Zuordnungen zu Eigenschaftenspalten sind in einem untergeordneten ScalarProperty-Element angegeben.

Die ComplexType-Eigenschaft kann die folgenden untergeordneten Elemente aufweisen:

  • ScalarProperty (keins oder mehr)
  • ComplexProperty (keins oder mehr)
  • ComplextTypeMapping (keins oder mehr)
  • Condition (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das ComplexProperty-Element anwendbar sind:

Attributname Ist erforderlich Wert
Name Ja Der Name der komplexen Eigenschaft eines Entitätstyps im konzeptionellen Modell, die zugeordnet wird.
TypeName Nein Der mit einem Namespace qualifizierte Name des Eigenschaftentyps im konzeptionellen Modell.

Beispiel

Das folgende Beispiel beruht auf dem School-Modell. Dem konzeptionellen Modell wurde der folgende komplexe Typ hinzugefügt:

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

Die Eigenschaften LastName und FirstName des Entitätstyps Person wurden durch eine komplexe Eigenschaft ersetzt, nämlich 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>

Die folgende MSL zeigt das ComplexProperty-Element, das zum Zuordnen der Name-Eigenschaft zu Spalten in der zugrunde liegenden Datenbank verwendet wird:

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

ComplexTypeMapping-Element (MSL)

Das ComplexTypeMapping-Element der Mapping-Spezifikationssprache (MSL) definiert die Zuordnung eines Funktionsimports im konzeptionellen Modell zu einer gespeicherten Prozedur in der zugrunde liegenden Datenbank, wenn Folgendes zutrifft:

  • Der Funktionsimport gibt einen konzeptionellen komplexen Typ zurück.
  • Die Namen der Spalten, die von der gespeicherten Prozedur zurückgegeben werden, entsprechen nicht genau den Namen der Eigenschaften für den komplexen Typ.

Standardmäßig basiert die Zuordnung der von einer gespeicherten Prozedur zurückgegebenen Spalten zu einem komplexen Typ auf den Spalten- und Eigenschaftennamen. Wenn Spaltennamen nicht exakt mit den Eigenschaftennamen übereinstimmen, müssen Sie die Zuordnung mithilfe des ComplexTypeMapping-Elements definieren. Ein Beispiel für die Standardzuordnung finden Sie unter FunctionImportMapping-Element (MSL).

Das ComplexTypeMapping-Element kann die folgenden untergeordneten Elemente aufweisen:

  • ScalarProperty (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die für das ComplexTypeMapping-Element gelten.

Attributname Ist erforderlich Wert
TypeName Ja Der namespacequalifizierte Name des komplexen Typs, der zugeordnet wird.

Beispiel

Sehen Sie sich die folgende gespeicherte Prozedur an:

 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

Betrachten Sie auch den folgenden komplexen Typ des konzeptionellen Modells:

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

Um einen Funktionsimport zu erstellen, der Instanzen des vorherigen komplexen Typs zurückgibt, muss die Zuordnung der Spalten, die von der gespeicherten Prozedur zurückgegeben werden, zu dem Entitätstyp in einem ComplexTypeMapping-Element definiert werden:

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

Condition-Element (MSL)

Das Condition-Element der Mapping-Spezifikationssprache (MSL) definiert Bedingungen für Zuordnungen zwischen dem konzeptionellen Modell und der zugrunde liegenden Datenbank. Die innerhalb eines XML-Knotens definierte Zuordnung ist gültig, wenn alle Bedingungen, die in untergeordneten Condition-Elementen angegeben werden, erfüllt werden. Andernfalls ist die Zuordnung ungültig. Wenn ein MappingFragment-Element z. B. ein oder mehrere untergeordnete Condition-Elemente enthält, ist die innerhalb des MappingFragment-Knotens definierte Zuordnung nur gültig, wenn alle Bedingungen für die untergeordneten Condition-Elemente erfüllt werden.

Jede Bedingung kann entweder für Name (der Name einer Entitätseigenschaft im konzeptionellen Modell, der durch das Name-Attribut angegeben wurde) oder für ColumnName (der Name einer Datenbankspalte, der durch das ColumnName-Attribut angegeben wurde) gelten. Wenn das Name-Attribut festgelegt wird, wird die Bedingung mit einem Entitätseigenschaftswert verglichen. Wenn das ColumnName-Attribut festgelegt wird, wird die Bedingung mit einem Spaltenwert verglichen. Nur eins der Attribute Name oder ColumnName, kann in einem Condition-Element angegeben werden.

Hinweis

Wenn das Condition-Element in einem FunctionImportMapping-Element verwendet wird, ist nur das Name-Attribut nicht anwendbar.

Das Condition-Element kann ein untergeordnetes Element der folgenden Elemente sein:

  • AssociationSetMapping
  • ComplexProperty
  • EntitySetMapping
  • MappingFragment
  • EntityTypeMapping

Das Condition-Element kann keine untergeordneten Elemente aufweisen.

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das Condition-Element anwendbar sind:

Attributname Ist erforderlich Wert
ColumnName Nein Der Name der Tabellenspalte, deren Wert zur Auswertung der Bedingung verwendet wird.
IsNull Nein True und False. Wenn der Wert Wahr ist und der Spaltenwert null ist, oder der Wert Falsch ist und der Spaltenwert nicht null ist, ist die Bedingung wahr. Andernfalls ist die Bedingung nicht erfüllt (false).
Die IsNull- undValue-Attribute können nicht gleichzeitig verwendet werden.
Wert Nein Der Wert, mit dem der Spaltenwert verglichen werden soll. Wenn die Werte gleich sind, wird die Bedingung erfüllt (true). Andernfalls ist die Bedingung nicht erfüllt (false).
Die IsNull- undValue-Attribute können nicht gleichzeitig verwendet werden.
Name Nein Der Name der Entitätseigenschaft im konzeptionellen Modell, deren Wert zur Auswertung der Bedingung verwendet wird.
Dieses Attribut ist nicht anwendbar, wenn das Condition-Element innerhalb eines FunctionImportMapping-Elements verwendet wird.

Beispiel

Das folgende Beispiel zeigt Condition-Elemente als untergeordnete Elemente von MappingFragment-Elementen. Wenn HireDate nicht null ist und EnrollmentDate null ist, werden Daten zwischen dem SchoolModel.Instructor-Typ und den PersonID und HireDate-Spalten der Person-Tabelle zugeordnet. Wenn EnrollmentDate nicht null ist und HireDate null ist, werden Daten zwischen dem Typ SchoolModel.Student und den Spalten PersonID und Enrollment der Person-Tabelle zugeordnet.

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

DeleteFunction-Element (MSL)

In MSL (Mapping Specification Language) ordnet das DeleteFunction-Element die Löschfunktion eines Entitätstyps oder einer Zuordnung im konzeptionellen Modell einer gespeicherten Prozedur in der zugrunde liegenden Datenbank zu. Gespeicherte Prozeduren, denen Änderungsfunktionen zugeordnet werden, müssen im Speichermodell deklariert werden. Weitere Informationen finden Sie unter dem Function-Element (SSDL).

Hinweis

Wenn Sie nicht alle drei Einfüge-, Aktualisierungs- und Löschvorgänge eines Entitätstyps gespeicherten Prozeduren zuordnen, schlagen die nicht zugeordneten Vorgänge bei der Ausführung zur Laufzeit fehl, und es wird eine Ausnahme des Typs ausgelöst.

DeleteFunction angewendet auf EntityTypeMapping

Wenn das DeleteFunction-Element auf das EntityTypeMapping-Element angewendet wird, ordnet es die Einfügefunktion eines Entitätstyps im konzeptionellen Modell einer gespeicherten Prozedur zu.

Das DeleteFunction-Element kann die folgenden untergeordneten Elemente aufweisen, wenn es auf ein EntityTypeMapping-Element angewendet wird:

  • AssociationEnd (keins oder mehr)
  • ComplexProperty (keins oder mehr)
  • ScalarProperty (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die beim Anwenden auf ein EntityTypeMapping-Element auf das DeleteFunction-Element angewendet werden können.

Attributname Ist erforderlich Wert
FunctionName Ja Der mit einem Namespace qualifizierte Name der gespeicherten Prozedur, der die Löschfunktion zugeordnet wird. Die gespeicherte Prozedur muss im Speichermodell deklariert werden.
RowsAffectedParameter Nein Der Name des Ausgabeparameters, der die Anzahl der betroffenen Zeilen zurückgibt.

Beispiel

Das folgende Beispiel basiert auf dem School-Modell und zeigt das DeleteFunction-Element, das die Löschfunktion des Person-Entitätstyps der gespeicherten DeletePerson-Prozedur zuordnet. Die gespeicherte DeletePerson-Prozedur wird im Speichermodell deklariert.

 <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 angewendet auf AssociationSetMapping

Wenn das DeleteFunction-Element auf das AssociationSetMapping-Element angewendet wird, ordnet es die Löschfunktion einer Zuordnung im konzeptionellen Modell einer gespeicherten Prozedur zu.

Das DeleteFunction-Element kann die folgenden untergeordneten Elemente aufweisen, wenn es auf das AssociationSetMapping-Element angewendet wird:

  • EndProperty

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die beim Anwenden auf das AssociationSetMapping-Element auf das DeleteFunction-Element angewendet werden können.

Attributname Ist erforderlich Wert
FunctionName Ja Der mit einem Namespace qualifizierte Name der gespeicherten Prozedur, der die Löschfunktion zugeordnet wird. Die gespeicherte Prozedur muss im Speichermodell deklariert werden.
RowsAffectedParameter Nein Der Name des Ausgabeparameters, der die Anzahl der betroffenen Zeilen zurückgibt.

Beispiel

Das folgende Beispiel basiert auf dem School-Modell und zeigt das DeleteFunction-Element, das die Löschfunktion der CourseInstructor-Zuordnung der gespeicherten DeleteCourseInstructor-Prozedur zuordnet. Die gespeicherte DeleteCourseInstructor-Prozedur wird im Speichermodell deklariert.

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

EndProperty-Element (MSL)

Das EndProperty-Element der Mapping-Spezifikationssprache (MSL) definiert die Zuordnung eines Endes oder einer Änderungsfunktion einer konzeptionellen Modellzuordnung zu der zugrunde liegenden Datenbank. Die Zuordnung zur Eigenschaftenspalte ist in einem untergeordneten ScalarProperty-Element angegeben.

Wenn ein EndProperty-Element verwendet wird, um die Zuordnung des Endes einer konzeptionellen Modell-Zuordnung zu definieren, ist dieses Element ein untergeordnetes Element eines AssociationSetMapping-Elements. Wenn das EndProperty-Element verwendet wird, um die Zuordnung für eine Änderungsfunktion einer konzeptionelle Modell-Zuordnung zu definieren, ist dieses Element ein untergeordnetes Element eines InsertFunction- oder eines DeleteFunction-Elements.

Das EndProperty-Element kann die folgenden untergeordneten Elemente aufweisen:

  • ScalarProperty (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das EndProperty-Element anwendbar sind:

Attributname Ist erforderlich Wert
Name Ja Der Name des Zuordnungsendes, das zugeordnet wird.

Beispiel

Das folgende Beispiel zeigt ein AssociationSetMapping-Element, in dem die FK_Course_Department-Zuordnung im konzeptionellen Modell der Kurstabelle in der Datenbank zugeordnet ist. Zuordnungen von Zuordnungstypeigenschaften zu Tabellenspalten werden in untergeordneten EndProperty-Elementen angegeben.

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

Beispiel

Im folgenden Beispiel wird das EndProperty-Element gezeigt, das die Insert- und Delete-Funktionen einer Zuordnung (CourseInstructor) gespeicherten Prozeduren in der zugrunde liegenden Datenbank zuordnet. Die Funktionen, denen sie zugeordnet werden, sind im Speichermodell deklariert.

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

EntityContainerMapping-Element (MSL)

In MSL ordnet das EntityContainerMapping-Element dem Entitätscontainer im konzeptionellen Modell den Entitätscontainer im Speichermodell zu. Das EntityContainerMapping-Element ist ein untergeordnetes Element des Zuordnungs-Elements.

Das EntityContainerMapping-Element kann die folgenden untergeordneten Elemente aufweisen (in der aufgeführten Reihenfolge):

  • EntitySetMapping (keins oder mehr)
  • AssociationSetMapping (keins oder mehr)
  • FunctionImportMapping (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das EntityContainerMapping-Element angewendet werden können.

Attributname Ist erforderlich Wert
StorageModelContainer Ja Der Name des Entitätscontainers im Speichermodell, der zugeordnet wird.
CdmEntityContainer Ja Der Name des Entitätscontainers im konzeptionellen Modell, der zugeordnet wird.
GenerateUpdateViews Nein True und False. Wenn Falsch, dann werden keine Updateansichten generiert. Dieses Attribut sollte auf Falsch festgelegt werden, wenn eine schreibgeschützte Zuordnung vorliegt, die ungültig wäre, weil Daten möglicherweise nicht erfolgreich aktualisiert wurden.
Der Standardwert ist True.

Beispiel

Das folgende Beispiel zeigt ein EntityContainerMapping-Element, das den SchoolModelEntities-Container (der konzeptionelle Modellentitätscontainer) dem SchoolModelStoreContainer-Container (dem Container für die Speichermodellentität) zuordnet:

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

EntitySetMapping-Element (MSL)

Das EntitySetMapping-Element der Mapping-Spezifikationssprache (MSL) ordnet allen Typen einer Entitätenmenge im Speichermodell einer Entitätenmenge im konzeptionellen Modell zu. Eine Entitätenmenge im konzeptionellen Modell ist ein logischer Container für Instanzen der Entitäten des gleichen Typs (und abgeleiteter Typen). Eine Entitätenmenge im Speichermodell stellt eine Tabelle oder eine Ansicht in der zugrunde liegenden Datenbank dar. Der konzeptionelle Modellentitätssatz wird durch den Wert des Name-Attributs des EntitySetMapping-Elements angegeben. Die zugeordnete Tabelle oder Ansicht wird durch das StoreEntitySet-Attribut in jedem untergeordneten MappingFragment-Element oder im EntitySetMapping-Element selbst angegeben.

Das EntitySetMapping-Element kann die folgenden untergeordneten Elemente aufweisen:

  • EntityTypeMapping (keins oder mehr)
  • QueryView (keins oder eins)
  • MappingFragment (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das EntitySetMapping-Element angewendet werden können.

Attributname Ist erforderlich Wert
Name Ja Der Name der Entitätenmenge im konzeptionellen Modell, die zugeordnet wird.
TypeName1 Nein Der Name des Entitätstyp im konzeptionellen Modell, der zugeordnet wird.
StoreEntitySet1 Nein Der Name der Entitätenmenge im Speichermodell, die zugeordnet wird.
MakeColumnsDistinct Nein Wahr oder Falsch, je nachdem, ob nur unterschiedliche Zeilen zurückgegeben werden.
Wenn dieses Attribut auf Wahr festgelegt ist, muss das GenerateUpdateViews-Attribut des EntityContainerMapping-Elements auf Falsch festgelegt werden.

 

1 Das TypeName-Attribut und das StoreEntitySet-Attribut können anstelle des EntityTypeMapping-Elements und untergeordneter MappingFragment-Elemente verwendet werden, um einer einzelnen Tabelle einen einzelnen Entitätstyp zuzuordnen.

Beispiel

Im folgenden Beispiel wird ein EntitySetMapping-Element veranschaulicht, das drei Typen (ein Basistyp und zwei abgeleitete Typen) der Courses-Entitätenmenge des konzeptionellen Modells drei verschiedenen Tabellen der zugrunde liegenden Datenbank zuordnet. Die Tabellen werden durch das StoreEntitySet-Attribut in jedem MappingFragment-Element angegeben.

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

EntityTypeMapping-Element (MSL)

In MSL definiert das EntityTypeMapping-Element die Zuordnung von einem Entitätstyp im konzeptionellen Modell zu den Tabellen oder Ansichten in der zugrunde liegenden Datenbank. Informationen zu den Entitätstypen des konzeptionellen Modells und den zugrunde liegenden Datenbanktabellen oder Ansichten finden Sie in EntityType-Element (CSDL) und EntitySet-Element (SSDL). Der konzeptionelle Modellentitätstyp, der zugeordnet wird, wird durch das TypeName-Attribut des EntityTypeMapping-Elements angegeben. Die Tabelle oder die Ansicht, die zugeordnet wird, wird durch das StoreEntitySet-Attribut des untergeordneten MappingFragment-Elements angegeben.

Das untergeordnete ModificationFunctionMapping-Element kann verwendet werden, um gespeicherten Prozeduren in der Datenbank die Einfüge-, Aktualisierungs- oder Löschfunktionen von Entitätstypen zuzuordnen.

Das EntityTypeMapping-Element kann die folgenden untergeordneten Elemente aufweisen:

  • MappingFragment (keins oder mehr)
  • ModificationFunctionMapping (keins oder eins)
  • ScalarProperty
  • Bedingung

Hinweis

MappingFragment- und ModificationFunctionMapping-Elemente können nicht gleichzeitig untergeordnete Elemente des EntityTypeMapping-Elements sein.

Hinweis

Die ScalarProperty- und Condition-Elemente können nur untergeordnete Elemente des EntityTypeMapping-Elements sein, wenn es in einem FunctionImportMapping-Element verwendet wird.

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das EntityTypeMapping-Element angewendet werden können.

Attributname Ist erforderlich Wert
TypeName Ja Der mit einem Namespace qualifizierte Name des Entitätstyps des konzeptionellen Modells, der zugeordnet wird.
Wenn der Typ abstrakt oder ein abgeleiteter Typ ist, muss der Wert IsOfType(Namespace-qualified_type_name) lauten.

Beispiel

Im folgenden Beispiel wird ein EntitySetMapping-Element mit zwei untergeordneten EntityTypeMapping-Elementen veranschaulicht. Im ersten EntityTypeMapping-Element wird der SchoolModel.Person-Entitätstyp der Person-Tabelle zugeordnet. Im zweiten EntityTypeMapping-Element wird die Aktualisierungsfunktionalität des SchoolModel.Person-Typs einer gespeicherten Prozedur, nämlich UpdatePerson, in der Datenbank zugeordnet.

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

Beispiel

Im nächsten Beispiel wird die Zuordnung einer Typhierarchie, in der der Stammtyp abstrakt ist, veranschaulicht. Beachten Sie die Verwendung des IsOfType-Syntax für das TypeName-Attribute.

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

FunctionImportMapping-Element (MSL)

Das FunctionImportMapping-Element der Mapping-Spezifikationssprache (MSL) definiert die Zuordnung zwischen einem Funktionsimport im konzeptionellen Modell und einer gespeicherten Prozedur oder Funktion in der zugrunde liegenden Datenbank. Funktionsimporte müssen im konzeptionellen Modell und gespeicherte Prozeduren müssen im Speichermodell deklariert werden. Weitere Informationen finden Sie unter FunctionImport Element (CSDL) und Function Element (SSDL).

Hinweis

Wenn ein Funktionsimport einen Entitätstyp des konzeptionellen Modells oder einen komplexen Typ zurückgibt, dann müssen standardmäßig die Namen der Spalten, die von der zugrunde liegenden gespeicherten Prozedur zurückgegeben werden, exakt den Namen der Eigenschaften des konzeptionellen Modelltyps entsprechen. Wenn die Spaltennamen nicht exakt mit den Namen der Eigenschaften übereinstimmen, muss die Zuordnung in einem ResultMapping-Element definiert werden.

Das FunctionImportMapping-Element kann die folgenden untergeordneten Elemente aufweisen:

  • ResultMapping (keins oder eins)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die für das FunctionImportMapping-Element gelten:

Attributname Ist erforderlich Wert
FunctionImportName Ja Der Name des Funktionsimports im konzeptionellen Modell, der zugeordnet wird.
FunctionName Ja Der mit einem Namespace qualifizierte Name der Funktion im Speichermodell, die zugeordnet wird.

Beispiel

Das folgende Beispiel beruht auf dem School-Modell. Betrachten Sie die folgende Funktion im Speichermodell:

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

Beachten Sie auch diesen Funktionsimport im konzeptionellen Modell:

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

Das folgende Beispiel zeigt ein FunctionImportMapping-Element, das verwendet wird, um die Funktion und den Funktionsimport miteinander zuzuordnen:

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

 

InsertFunction-Element (MSL)

In MSL ordnet das InsertFunction-Element die Einfügefunktion eines Entitätstyps oder einer Zuordnung im konzeptionellen Modell einer gespeicherten Prozedur in der zugrunde liegenden Datenbank zu. Gespeicherte Prozeduren, denen Änderungsfunktionen zugeordnet werden, müssen im Speichermodell deklariert werden. Weitere Informationen finden Sie unter dem Function-Element (SSDL).

Hinweis

Wenn Sie nicht alle drei Einfüge-, Aktualisierungs- und Löschvorgänge eines Entitätstyps gespeicherten Prozeduren zuordnen, schlagen die nicht zugeordneten Vorgänge bei der Ausführung zur Laufzeit fehl, und es wird eine Ausnahme des Typs ausgelöst.

Das InsertFunction-Element kann ein untergeordnetes Element des ModificationFunctionMapping-Elements sein und auf das EntityTypeMapping-Element oder das AssociationSetMapping-Element angewendet werden.

InsertFunction angewendet auf EntityTypeMapping

Wenn das InsertFunction-Element auf das EntityTypeMapping-Element angewendet wird, ordnet es die Einfügefunktion eines Entitätstyps im konzeptionellen Modell einer gespeicherten Prozedur zu.

Das InsertFunction-Element kann die folgenden untergeordneten Elemente aufweisen, wenn es auf ein EntityTypeMapping-Element angewendet wird:

  • AssociationEnd (keins oder mehr)
  • ComplexProperty (keins oder mehr)
  • ResultBinding (keins oder eins)
  • ScalarProperty (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die beim Anwenden auf ein EntityTypeMapping-Element auf das InsertFunction-Element angewendet werden können.

Attributname Ist erforderlich Wert
FunctionName Ja Der mit einem Namespace qualifizierte Name der gespeicherten Prozedur, der die Einfügefunktion zugeordnet wird. Die gespeicherte Prozedur muss im Speichermodell deklariert werden.
RowsAffectedParameter Nein Der Name des Ausgabeparameters, der die Anzahl der betroffenen Zeilen zurückgibt.

Beispiel

Das folgende Beispiel basiert auf dem School-Modell und zeigt ein InsertFunction-Element, das verwendet wird, um die Einfügefunktion des Entitätstyps Person der gespeicherten Prozedur InsertPerson zuzuordnen. Die gespeicherte InsertPerson-Prozedur wird im Speichermodell deklariert.

 <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 angewendet auf AssociationSetMapping

Wenn das InsertFunction-Element auf das AssociationSetMapping-Element angewendet wird, ordnet es die Einfügefunktion einer Zuordnung im konzeptionellen Modell einer gespeicherten Prozedur zu.

Das InsertFunction-Element kann die folgenden untergeordneten Elemente aufweisen, wenn es auf das AssociationSetMapping-Element angewendet wird:

  • EndProperty

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die beim Anwenden auf das AssociationSetMapping-Element auf das InsertFunction-Element angewendet werden können.

Attributname Ist erforderlich Wert
FunctionName Ja Der mit einem Namespace qualifizierte Name der gespeicherten Prozedur, der die Einfügefunktion zugeordnet wird. Die gespeicherte Prozedur muss im Speichermodell deklariert werden.
RowsAffectedParameter Nein Der Name des Ausgabeparameters, der die Anzahl der betroffenen Zeilen zurückgibt.

Beispiel

Das folgende Beispiel basiert auf dem School-Modell und zeigt das InsertFunction-Element, das zum Zuordnen der Insert-Funktion der CourseInstructor-Zuordnung zur gespeicherten Prozedur InsertCourseInstructor verwendet wird. Die gespeicherte InsertCourseInstructor-Prozedur wird im Speichermodell deklariert.

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

Mapping-Element (MSL)

Das Mapping-Element der Mapping-Spezifikationssprache (MSL) enthält Informationen zum Zuordnen von Objekten, die in einem konzeptionellen Modell zu einer Datenbank (wie in einem Speichermodell beschrieben) definiert werden. Weitere Informationen finden Sie unter CSDL-Spezifikation und SSDL-Spezifikation.

Das Mapping-Element ist das Stammelement für eine Mapping-Spezifikation. Der XML-Namespace für Zuordnungsspezifikationen lautet https://schemas.microsoft.com/ado/2009/11/mapping/cs.

Das Mapping-Element kann die folgenden untergeordneten Elemente aufweisen (der vorliegenden Reihenfolge entsprechend):

  • Alias (keins oder mehr)
  • EntityContainerMapping (genau eins)

Die Namen aller Typen des konzeptionellen Modells und Typen des Speichermodells, auf die in MSL verwiesen wird, müssen mit dem jeweiligen Namespacenamen qualifiziert werden. Informationen zum Namespacenamen des konzeptionellen Modells finden Sie unter Schema-Element (CSDL). Informationen zum Namespacenamen des Speichermodells finden Sie unter Schema-Element (SSDL). Aliasnamen für Namespaces, die in MSL verwendet werden, können mit dem Alias-Element definiert werden.

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die für das Mapping-Element übernommen werden können.

Attributname Ist erforderlich Wert
Space Ja C-S. Dies ist ein fester Wert, der nicht geändert werden kann.

Beispiel

Das folgende Beispiel zeigt ein Mapping-Element, das teilweise auf dem School-Modell beruht. Weitere Informationen zum School-Modell finden Sie in der Schnellstartanleitung (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>

MappingFragment-Element (MSL)

In MSL definiert das MappingFragment-Element die Zuordnung der Eigenschaften eines Entitätstyps im konzeptionellen Modell zu einer Tabelle oder Ansicht der Datenbank. Informationen zu den Entitätstypen des konzeptionellen Modells und den zugrunde liegenden Datenbanktabellen oder Ansichten finden Sie in EntityType-Element (CSDL) und EntitySet-Element (SSDL). Das MappingFragment-Element kann ein untergeordnetes Element des EntityTypeMapping-Elements oder des EntitySetMapping-Elements sein.

Das MappingFragment-Element kann die folgenden untergeordneten Elemente aufweisen:

  • ComplexType (keins oder mehr)
  • ScalarProperty (keins oder mehr)
  • Condition (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das MappingFragment-Element angewendet werden können.

Attributname Ist erforderlich Wert
StoreEntitySet Ja Der Name der Tabelle oder Ansicht, die zugeordnet wird.
MakeColumnsDistinct Nein Wahr oder Falsch, je nachdem, ob nur unterschiedliche Zeilen zurückgegeben werden.
Wenn dieses Attribut auf Wahr festgelegt ist, muss das GenerateUpdateViews-Attribut des EntityContainerMapping-Elements auf Falsch festgelegt werden.

Beispiel

Das folgende Beispiel zeigt ein MappingFragment-Element als untergeordnetes Element eines EntityTypeMapping-Elements. In diesem Beispiel werden Spalten der Course-Tabelle in der Datenbank Eigenschaften des Course-Typs im konzeptionellen Modell zugeordnet.

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

Beispiel

Das folgende Beispiel zeigt ein MappingFragment-Element als untergeordnetes Element eines EntitySetMapping-Elements. Wie im Beispiel oben werden Spalten der Course-Tabelle in der Datenbank Eigenschaften des Course-Typs im konzeptionellen Modell zugeordnet.

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

ModificationFunctionMapping-Element (MSL)

Das ModificationFunctionMapping-Element der Mapping-Spezifikationssprache (MSL) ordnet die Insert-, Update- und Delete-Funktionen eines Entitätstyps des konzeptionellen Modells gespeicherten Prozeduren in der zugrunde liegenden Datenbank zu. Das ModificationFunctionMapping-Element kann auch die Insert- und Delete-Funktionen für m:n-Zuordnungen im konzeptionellen Modell gespeicherten Prozeduren in der zugrunde liegenden Datenbank zuordnen. Gespeicherte Prozeduren, denen Änderungsfunktionen zugeordnet werden, müssen im Speichermodell deklariert werden. Weitere Informationen finden Sie unter dem Function-Element (SSDL).

Hinweis

Wenn Sie nicht alle drei Einfüge-, Aktualisierungs- und Löschvorgänge eines Entitätstyps gespeicherten Prozeduren zuordnen, schlagen die nicht zugeordneten Vorgänge bei der Ausführung zur Laufzeit fehl, und es wird eine Ausnahme des Typs ausgelöst.

Hinweis

Wenn die Änderungsfunktionen für eine Entität in einer Vererbungshierarchie gespeicherten Prozeduren zugeordnet werden, dann müssen die Änderungsfunktionen für alle Typen in der Hierarchie gespeicherten Prozeduren zugeordnet werden.

Das ModificationFunctionMapping-Element kann ein untergeordnetes Element des ModificationFunctionMapping-Elements sein und auf das EntityTypeMapping-Element oder das AssociationSetMapping-Element angewendet werden.

Das ModificationFunctionMapping-Element kann die folgenden untergeordneten Elemente aufweisen:

  • DeleteFunction (keins oder eins)
  • InsertFunction (keins oder eins)
  • UpdateFunction (keins oder eins)

Für das ModificationFunctionMapping-Element gelten keine Attribute.

Beispiel

Im folgenden Beispiel wird die Zuordnung des People-Entitätssatzes im School-Modell gezeigt. Zusätzlich zur Spaltenzuordnung für den Person-Entitätstyp wird die Zuordnung der Insert-, Update- und Delete-Funktionen des Person-Typs gezeigt. Die Funktionen, denen sie zugeordnet werden, sind im Speichermodell deklariert.

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

Beispiel

Im folgenden Beispiel wird gezeigt, wie der CourseInstructor-Zuordnungssatz im School-Modell zugeordnet wird. Zusätzlich zur Spaltenzuordnung für die CourseInstructor-Zuordnung werden die Zuordnung der Einfüge- und Löschfunktionen der CourseInstructor-Zuordnung angezeigt. Die Funktionen, denen sie zugeordnet werden, sind im Speichermodell deklariert.

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

 

 

QueryView-Element (MSL)

Das QueryView-Element der Mapping-Spezifikationssprache (MSL) definiert eine schreibgeschützte Zuordnung eines Entitätstyp oder einer Zuordnung im konzeptionellen Modell zu einer Tabelle in der zugrunde liegenden Datenbank. Diese Zuordnung wird mithilfe einer Entity SQL-Abfrage definiert, die im Speichermodell ausgewertet wird. Der Ergebnissatz wird als Entität oder Zuordnung im konzeptionellen Modell ausgedrückt. Da Abfragesichten schreibgeschützt sind, können die durch Abfragesichten definierten Typen nicht mit herkömmlichen Aktualisierungsbefehlen aktualisiert werden. Diese Typen können mithilfe von Änderungsfunktionen aktualisiert werden. Weitere Informationen finden Sie in der Anleitung: Zuordnen von Änderungsfunktionen zu gespeicherten Prozeduren.

Hinweis

Im QueryView-Element werden keine Entity SQL-Ausdrücke, die GroupBy enthalten, keine Gruppenaggregate und keine Navigationseigenschaften unterstützt.

 

Das QueryView-Element kann ein untergeordnetes Element des EntitySetMapping- oder des AssociationSetMapping-Elements sein. Im ersten Fall definiert die Abfrageansicht eine schreibgeschützte Zuordnung für eine Entität im konzeptionellen Modell. Im zweiten Fall definiert die Abfrageansicht eine schreibgeschützte Zuordnung für eine Zuordnung im konzeptionellen Modell.

Hinweis

Wenn das AssociationSetMapping-Element für eine Zuordnung mit einer referenziellen Einschränkung bestimmt ist, wird das AssociationSetMapping-Element ignoriert. Weitere Informationen finden Sie unter ReferentialConstraint-Element (CSDL).

Das QueryView-Element darf keine untergeordneten Elemente enthalten.

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das QueryView-Element angewendet werden können.

Attributname Ist erforderlich Wert
TypeName Nein Der Name des konzeptionellen Modelltyps, der durch die Abfrageansicht zugeordnet wird.

Beispiel

Das folgende Beispiel zeigt das QueryView-Element als untergeordnetes Element des EntitySetMapping-Elements und definiert eine Abfrageansichtszuordnung für den Entitätstyp Department im School-Model.

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

Da die Abfrage nur eine Untermenge der Mitglieder des Department-Typs im Speichermodell zurückgibt, wurde der Department-Typ im School-Modell auf der Grundlage dieser Zuordnung wie folgt geändert:

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

Beispiel

Das nächste Beispiel zeigt das QueryView-Element als untergeordnetes Element eines AssociationSetMapping-Elements und definiert eine schreibgeschützte Zuordnung für die FK_Course_Department-Zuordnung im School-Modell.

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

 

Kommentare

Sie können Abfragesichten definieren, um die folgenden Szenarien zu ermöglichen:

  • Definieren einer Entität im konzeptionellen Modell, die nicht alle Eigenschaften der Entität im Speichermodell einschließt. Dies schließt Eigenschaften ein, die keine Standardwerte haben und keine NULL-Werte unterstützen.
  • Zuordnen von berechneten Spalten im Speichermodell zu Eigenschaften von Entitätstypen im konzeptionellen Modell.
  • Definieren eines Mappings, bei dem die Bedingungen, die für die Partitionierung von Entitäten im konzeptionellen Modell verwendet werden, nicht auf Gleichheit basieren. Wenn Sie ein bedingtes Mapping mithilfe des Condition-Elements festlegen, muss die angegebene Bedingung gleich dem angegebenen Wert sein. Weitere Informationen finden Sie unter Condition Element (MSL).
  • Zuordnen derselben Spalte im Speichermodell zu mehreren Typen im konzeptionellen Modell.
  • Zuordnen mehrerer Typen zu derselben Tabelle.
  • Definieren von Zuordnungen im konzeptionellen Modell, die nicht auf Fremdschlüsseln im relationalen Schema basieren.
  • Verwenden benutzerdefinierter Geschäftslogik, um die Werte von Eigenschaften im konzeptionellen Modell festzulegen. Sie können beispielsweise den Zeichenfolgenwert "T" in der Datenquelle dem booleschen Wert wahr im konzeptionellen Modell zuordnen.
  • Definieren bedingter Filter für Abfrageergebnisse.
  • Erzwingen von geringeren Dateneinschränkungen im konzeptionellen Modell als im Speichermodell. Sie können beispielsweise eine Eigenschaft im konzeptionellen Modell als nulllfähig festlegen, auch wenn die zugeordnete Spalte NULL-Werte nicht unterstützt.

Die folgenden Aspekte gelten, wenn Sie Abfragesichten für Entitäten definieren:

  • Abfragesichten sind schreibgeschützt. Sie können Entitäten nur mit Änderungsfunktionen aktualisieren.
  • Wenn Sie eine Entität durch eine Abfragesicht definieren, müssen Sie auch alle verknüpften Entitäten durch Abfragesichten definieren.
  • Wenn Sie eine m:n-Zuordnung einer Entität im Speichermodell zuordnen, die eine Linktabelle im relationalen Schema darstellt, müssen Sie für diese Linktabelle ein QueryView-Element im AssociationSetMapping-Element definieren.
  • Abfragesichten müssen für alle Typen in einer Typhierarchie definiert werden. Sie können dies auf folgende Arten tun:
    • Mit einem einzelnen QueryView-Element, das eine einzelne Entity SQL-Abfrage angibt, die eine Union aller Entitätstypen in der Hierarchie zurückgibt.
    • Mit einem einzelnen QueryView-Element, das eine einzelne Entity SQL-Abfrage angibt, die den CASE-Operator verwendet, um einen speziellen Entitätstyp in der Hierarchie auf Basis einer bestimmten Bedingung zurückzugeben.
    • Mit einem zusätzlichen QueryView-Element für einen bestimmten Typ in der Hierarchie. Verwenden Sie in diesem Fall das TypeName-Attribut des QueryView-Elements, um den Entitätstyp für jede Ansicht anzugeben.
  • Wenn eine Abfrageansicht definiert ist, können Sie das StorageSetName-Attribut für das EntitySetMapping-Element nicht angeben.
  • Wenn eine Abfrageansicht definiert ist, kann das EntitySetMapping-Element keine Property-Zuordnungen enthalten.

ResultBinding-Element (MSL)

Das ResultBinding-Element der Mapping-Spezifikationssprache (MSL) ordnet Spaltenwerte, die von gespeicherten Prozeduren zurückgegeben werden, Entitätseigenschaften im konzeptionellen Modell zu, wenn die den Entitätstyp ändernden Funktionen gespeicherten Prozeduren in der zugrunde liegenden Datenbank zugeordnet sind. Wenn der Wert einer Identitätsspalte beispielsweise von einer gespeicherten Einfügeprozedur zurückgegeben wird, ordnet das ResultBinding-Element den zurückgegebenen Wert einer Entitätstypeigenschaft im konzeptionellen Modell zu.

Das ResultBinding-Element kann ein untergeordnetes Element des InsertFunction-Elements oder des UpdateFunction-Elements sein.

Das ResultBinding-Element darf keine untergeordneten Elemente aufweisen.

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das ResultBinding-Element anwendbar sind:

Attributname Ist erforderlich Wert
Name Ja Der Name der Entitätseigenschaft im konzeptionellen Modell, die zugeordnet wird.
ColumnName Ja Der Name der Spalte, die zugeordnet wird.

Beispiel

Das folgende Beispiel basiert auf dem School-Modell und zeigt ein InsertFunction-Element, mit dem die Einfügefunktion des Entitätstyps Person der gespeicherten InsertPerson-Prozedur zugeordnet wird. (Die gespeicherte Prozedur InsertPerson wird unten dargestellt und ist im Speichermodell deklariert.) Ein ResultBinding-Element wird verwendet, um einen Spaltenwert zuzuordnen, der von der gespeicherten Prozedur (NewPersonID) an eine Entitätstypeigenschaft (PersonID) zurückgegeben wird.

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

Die folgende Transact-SQL-Datei beschreibt die gespeicherte InsertPerson-Prozedur:

 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;

ResultMapping-Element (MSL)

Das ResultMapping-Element der Mapping-Spezifikationssprache (MSL) definiert die Zuordnung eines Funktionsimports im konzeptionellen Modell zu einer gespeicherten Prozedur in der zugrunde liegenden Datenbank, wenn Folgendes zutrifft:

  • Der Funktionsimport gibt einen Entitätstyp des konzeptionellen Modells oder einen komplexen Typ zurück.
  • Die Namen der Spalten, die von der gespeicherten Prozedur zurückgegeben werden, entsprechen nicht exakt den Namen der Eigenschaften für den Entitätstyp oder den komplexem Typ.

Standardmäßig basiert die Zuordnung der von einer gespeicherten Prozedur zurückgegebenen Spalten zu einem Entitätstyp oder einem komplexen Typ auf den Spalten- und Eigenschaftennamen. Wenn Spaltennamen nicht exakt mit den Eigenschaftennamen übereinstimmen, müssen Sie die Zuordnung mithilfe des ResultMapping-Elements definieren. Ein Beispiel für die Standardzuordnung finden Sie unter FunctionImportMapping-Element (MSL).

Das ResultMapping-Element ist ein untergeordnetes Element FunctionImportMapping-Elements.

Das ResultMapping-Element kann die folgenden untergeordneten Elemente aufweisen:

  • EntityTypeMapping (keins oder mehr)
  • ComplexTypeMapping

Für das ResultMapping-Element gelten keine Attribute.

Beispiel

Sehen Sie sich die folgende gespeicherte Prozedur an:

 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

Betrachten Sie auch den folgenden Entitätstyp des konzeptionellen Modells:

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

Um einen Funktionsimport zu erstellen, der Instanzen des vorherigen Entitätstyps zurückgibt, muss die Zuordnung der Spalten, die von der gespeicherten Prozedur zurückgegeben werden, zu dem Entitätstyp in einem ResultMapping-Element definiert werden:

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

ScalarProperty-Element (MSL)

In MSL ordnet das ScalarProperty-Element eine Eigenschaft eines Entitätstyps des konzeptionellen Modells, eines komplexen Typs oder einer Zuordnung einer Tabellenspalte oder einem Parameter einer gespeicherten Prozedur in der zugrunde liegenden Datenbank zu.

Hinweis

Gespeicherte Prozeduren, denen Änderungsfunktionen zugeordnet werden, müssen im Speichermodell deklariert werden. Weitere Informationen finden Sie unter dem Function-Element (SSDL).

Das ScalarProperty-Element kann ein untergeordnetes Element der folgenden Elemente sein:

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

Als untergeordnetes Element des MappingFragment-, ComplexProperty- oder EndProperty-Elements ordnet das ScalarProperty-Element eine Eigenschaft im konzeptionellen Modell einer Spalte in der Datenbank zu. Als untergeordnetes Element des InsertFunction-, UpdateFunction oder DeleteFunction-Elements ordnet das ScalarProperty-Element eine Eigenschaft im konzeptionellen Modell einem gespeicherten Prozedurparameter zu.

Das ScalarProperty-Element darf keine untergeordneten Elemente enthalten.

Anwendbare Attribute

Welche Attribute auf das ScalarProperty-Element anwendbar sind, hängt von der Rolle des Elements ab.

In der folgenden Tabelle werden die Attribute beschrieben, die anwendbar sind, wenn das ScalarProperty-Element verwendet wird, um eine Eigenschaft des konzeptionellen Modells einer Spalte in der Datenbank zuzuordnen:

Attributname Ist erforderlich Wert
Name Ja Der Name der Eigenschaft im konzeptionellen Modell, die zugeordnet wird.
ColumnName Ja Der Name der Tabellenspalte, die zugeordnet wird.

In der folgenden Tabelle werden die Attribute beschrieben, die auf das ScalarProperty-Element anwendbar sind, wenn es verwendet wird, um einem Parameter einer gespeicherten Prozedur eine Eigenschaft im konzeptionellen Modell zuzuordnen:

Attributname Ist erforderlich Wert
Name Ja Der Name der Eigenschaft im konzeptionellen Modell, die zugeordnet wird.
Parametername Ja Der Name des Parameters, der zugeordnet wird.
Version Nein Current oder Original abhängig davon, ob der aktuelle Wert oder der ursprüngliche Wert der Eigenschaft für Parallelitätsprüfungen verwendet werden sollen.

Beispiel

Das folgende Beispiel zeigt das ScalarProperty-Element auf zwei Arten:

  • So ordnen Sie die Eigenschaften des Person-Entitätstyps den Spalten der Person-Tabelle zu.
  • Um die Eigenschaften des Entitätstyps Person den Parametern der gespeicherten UpdatePerson-Prozedur zuzuordnen. Die gespeicherten Prozeduren werden im Speichermodell deklariert.
 <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>

Beispiel

Im nächsten Beispiel wird das ScalarProperty-Element veranschaulicht, das verwendet wird, um die Einfüge- und Löschfunktion einer Zuordnung in einem konzeptionellen Modell gespeicherten Prozeduren in der Datenbank zuzuordnen. Die gespeicherten Prozeduren werden im Speichermodell deklariert.

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

UpdateFunction-Element (MSL)

In MSL ordnet das UpdateFunction-Element die Einfüge-, Aktualisierungs- und Löschfunktionen eines Entitätstyps im konzeptionellen Modell gespeicherten Prozeduren in der zugrunde liegenden Datenbank zu. Gespeicherte Prozeduren, denen Änderungsfunktionen zugeordnet werden, müssen im Speichermodell deklariert werden. Weitere Informationen finden Sie unter dem Function-Element (SSDL).

Hinweis

Wenn Sie nicht alle drei Einfüge-, Aktualisierungs- und Löschvorgänge eines Entitätstyps gespeicherten Prozeduren zuordnen, schlagen die nicht zugeordneten Vorgänge bei der Ausführung zur Laufzeit fehl, und es wird eine Ausnahme des Typs ausgelöst.

Das UpdateFunction-Element kann ein untergeordnetes Element des ModificationFunctionMapping-Elements sein und auf das EntityTypeMapping-Element angewendet werden.

Das UpdateFunction-Element kann über die folgenden untergeordneten Elemente verfügen:

  • AssociationEnd (keins oder mehr)
  • ComplexProperty (keins oder mehr)
  • ResultBinding (keins oder eins)
  • ScalarProperty (keins oder mehr)

Anwendbare Attribute

In der folgenden Tabelle werden die Attribute beschrieben, die auf das UpdateFunction-Element angewendet werden können.

Attributname Ist erforderlich Wert
FunctionName Ja Der mit einem Namespace qualifizierte Name der gespeicherten Prozedur, der die Aktualisierungsfunktion zugeordnet wird. Die gespeicherte Prozedur muss im Speichermodell deklariert werden.
RowsAffectedParameter Nein Der Name des Ausgabeparameters, der die Anzahl der betroffenen Zeilen zurückgibt.

Beispiel

Das folgende Beispiel basiert auf dem School-Modell und zeigt das UpdateFunction-Element, das zum Zuordnen der Aktualisierungsfunktion des Entitätstyps Person zur gespeicherten Prozedur UpdatePerson verwendet wird. Die gespeicherte UpdatePerson-Prozedur wird im Speichermodell deklariert.

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