Specyfikacja MSL

Język specyfikacji mapowania (MSL) to język oparty na formacie XML, który opisuje mapowanie między modelem koncepcyjnym a modelem magazynu aplikacji Entity Framework.

W aplikacji platformy Entity Framework metadane mapowania są ładowane z pliku msl (napisanego w msL) w czasie kompilacji. Platforma Entity Framework używa metadanych mapowania w czasie wykonywania do tłumaczenia zapytań na model koncepcyjny w celu przechowywania poleceń specyficznych dla magazynu.

Program Entity Framework Projektant (EF Projektant) przechowuje informacje o mapowaniu w pliku edmx w czasie projektowania. W czasie kompilacji jednostka Projektant używa informacji w pliku edmx do utworzenia pliku msl wymaganego przez program Entity Framework w czasie wykonywania

Nazwy wszystkich typów modeli koncepcyjnych lub magazynowych, do których odwołuje się biblioteka MSL, muszą być kwalifikowane przez odpowiednie nazwy przestrzeni nazw. Aby uzyskać informacje na temat nazwy przestrzeni nazw modelu koncepcyjnego, zobacz Specyfikacja CSDL. Aby uzyskać informacje na temat nazwy przestrzeni nazw modelu magazynu, zobacz Specyfikacja SSDL.

Wersje biblioteki MSL są rozróżniane przez przestrzenie nazw XML.

Wersja MSL Przestrzeń nazw 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

Alias, element (MSL)

Element Alias w języku specyfikacji mapowania (MSL) jest elementem podrzędnym elementu Mapowanie, który służy do definiowania aliasów dla koncepcyjnych modeli i przestrzeni nazw modelu magazynu. Nazwy wszystkich typów modeli koncepcyjnych lub magazynowych, do których odwołuje się biblioteka MSL, muszą być kwalifikowane przez odpowiednie nazwy przestrzeni nazw. Aby uzyskać informacje o nazwie przestrzeni nazw modelu koncepcyjnego, zobacz Element schematu (CSDL). Aby uzyskać informacje o nazwie przestrzeni nazw modelu magazynu, zobacz Element schematu (SSDL).

Element Alias nie może mieć elementów podrzędnych.

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu Alias .

Nazwa atrybutu Jest wymagany Wartość
Klawisz Tak Alias przestrzeni nazw określony przez atrybut Value .
Wartość Tak Przestrzeń nazw, dla której wartość elementu Klucz jest aliasem.

Przykład

W poniższym przykładzie przedstawiono element Alias , który definiuje alias , cdla typów zdefiniowanych w modelu koncepcyjnym.

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

Element AssociationEnd w języku specyfikacji mapowania (MSL) jest używany, gdy funkcje modyfikacji typu jednostki w modelu koncepcyjnym są mapowane na procedury składowane w bazowej bazie danych. Jeśli procedura składowana modyfikacji przyjmuje parametr, którego wartość jest przechowywana we właściwości skojarzenia, element AssociationEnd mapuje wartość właściwości na parametr . Aby uzyskać więcej informacji, zobacz poniższy przykład.

Aby uzyskać więcej informacji na temat mapowania funkcji modyfikacji typów jednostek w procedurach składowanych, zobacz ModyfikowanieFunctionMapping Element (MSL) i Przewodnik: mapowanie jednostki na procedury składowane.

Element AssociationEnd może mieć następujące elementy podrzędne:

  • Właściwość skalarna

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu AssociationEnd .

Nazwa atrybutu Jest wymagany Wartość
Associationset Tak Nazwa mapowanego skojarzenia.
Z Tak Wartość atrybutu FromRole właściwości nawigacji odpowiadającej zamapowanemu skojarzeniu. Aby uzyskać więcej informacji, zobacz NavigationProperty, Element (CSDL).
Do Tak Wartość atrybutu ToRole właściwości nawigacji odpowiadającej zamapowanemu skojarzeniu. Aby uzyskać więcej informacji, zobacz NavigationProperty, Element (CSDL).

Przykład

Rozważmy następujący typ jednostki modelu koncepcyjnego:

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

Należy również wziąć pod uwagę następującą procedurę składowaną:

 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;

Aby zamapować funkcję Course aktualizacji jednostki na tę procedurę składowaną, należy podać wartość parametru DepartmentID . Wartość parametru DepartmentID nie odpowiada właściwości typu jednostki; jest ona zawarta w niezależnym skojarzeniu, którego mapowanie jest pokazane tutaj:

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

Poniższy kod przedstawia element AssociationEnd używany do mapowania właściwości DepartmentID skojarzenia FK_Course_Department do procedury składowanej UpdateCourse (do której jest mapowana funkcja aktualizacji typu jednostki 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>

AssociationSetMapping, element (MSL)

Element AssociationSetMapping w języku specyfikacji mapowania (MSL) definiuje mapowanie między skojarzeniem w modelu koncepcyjnym i kolumnach tabeli w bazowej bazie danych.

Skojarzenia w modelu koncepcyjnym to typy, których właściwości reprezentują kolumny klucza podstawowego i obcego w bazowej bazie danych. Element AssociationSetMapping używa dwóch elementów EndProperty do definiowania mapowań między właściwościami typu skojarzenia i kolumnami w bazie danych. Warunki na tych mapowaniach można umieścić za pomocą elementu Warunek. Zamapuj funkcje wstawiania, aktualizowania i usuwania dla skojarzeń do procedur składowanych w bazie danych za pomocą elementu ModificationFunctionMapping. Definiowanie mapowań tylko do odczytu między skojarzeniami i kolumnami tabeli przy użyciu ciągu SQL jednostki w elemecie QueryView.

Uwaga

Jeśli ograniczenie odwołania jest zdefiniowane dla skojarzenia w modelu koncepcyjnym, skojarzenie nie musi być mapowane za pomocą elementu AssociationSetMapping . Jeśli element AssociationSetMapping jest obecny dla skojarzenia, które ma ograniczenie odwołania, mapowania zdefiniowane w elemecie AssociationSetMapping zostaną zignorowane. Aby uzyskać więcej informacji, zobacz ReferentialConstraint, element (CSDL).

Element AssociationSetMapping może mieć następujące elementy podrzędne

  • QueryView (zero lub jeden)
  • EndProperty (zero lub dwa)
  • Warunek (zero lub więcej)
  • ModificationFunctionMapping (zero lub jeden)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu AssociationSetMapping .

Nazwa atrybutu Jest wymagany Wartość
Nazwa/nazwisko Tak Nazwa zestawu skojarzeń modelu koncepcyjnego, który jest mapowany.
Typename Nie. Kwalifikowana nazwa przestrzeni nazw typu skojarzenia modelu koncepcyjnego, który jest mapowany.
StoreEntitySet Nie. Nazwa tabeli, która jest mapowana.

Przykład

W poniższym przykładzie pokazano element AssociationSetMapping , w którym skojarzenie FK_Course_Department ustawione w modelu koncepcyjnym jest mapowane na tabelę Course w bazie danych. Mapowania między właściwościami typu skojarzenia i kolumnami tabeli są określone w podrzędnych elementach EndProperty .

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

Element ComplexProperty w języku specyfikacji mapowania (MSL) definiuje mapowanie między właściwością typu złożonego na koncepcyjnym typie jednostki modelu i kolumnach tabeli w bazowej bazie danych. Mapowania kolumn właściwości są określone w elementach podrzędnych ScalarProperty.

Element właściwości ComplexType może mieć następujące elementy podrzędne:

  • ScalarProperty (zero lub więcej)
  • ComplexProperty (zero lub więcej)
  • ComplexTypeMapping (zero lub więcej)
  • Warunek (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu ComplexProperty :

Nazwa atrybutu Jest wymagany Wartość
Nazwa/nazwisko Tak Nazwa złożonej właściwości typu jednostki w modelu koncepcyjnym, który jest mapowany.
Typename Nie. Kwalifikowana nazwa przestrzeni nazw typu właściwości modelu koncepcyjnego.

Przykład

Poniższy przykład jest oparty na modelu School. Do modelu koncepcyjnego dodano następujący złożony typ:

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

Właściwości LastName i FirstName typu jednostki Person zostały zastąpione jedną złożoną właściwością 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>

Poniższy plik MSL przedstawia element ComplexProperty używany do mapowania właściwości Name na kolumny w bazowej bazie danych:

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

Element ComplexTypeMapping w języku specyfikacji mapowania (MSL) jest elementem podrzędnym elementu ResultMapping i definiuje mapowanie między importowaniem funkcji w modelu koncepcyjnym a procedurą składowaną w bazowej bazie danych, gdy są spełnione następujące warunki:

  • Importowanie funkcji zwraca koncepcyjny typ złożony.
  • Nazwy kolumn zwracanych przez procedurę składowaną nie są dokładnie zgodne z nazwami właściwości typu złożonego.

Domyślnie mapowanie między kolumnami zwróconymi przez procedurę składowaną i typem złożonym opiera się na nazwach kolumn i właściwości. Jeśli nazwy kolumn nie są dokładnie zgodne z nazwami właściwości, należy użyć elementu ComplexTypeMapping do zdefiniowania mapowania. Aby zapoznać się z przykładem mapowania domyślnego, zobacz FunctionImportMapping, element (MSL).

Element ComplexTypeMapping może mieć następujące elementy podrzędne:

  • ScalarProperty (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu ComplexTypeMapping .

Nazwa atrybutu Jest wymagany Wartość
Typename Tak Kwalifikowana nazwa przestrzeni nazw typu złożonego, który jest mapowany.

Przykład

Rozważ następującą procedurę składowaną:

 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

Rozważ również następujący typ złożony modelu koncepcyjnego:

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

Aby utworzyć importowanie funkcji zwracającej wystąpienia poprzedniego typu złożonego, mapowanie między kolumnami zwróconymi przez procedurę składowaną a typem jednostki musi być zdefiniowane w elemecie 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>

Condition, element (MSL)

Element Warunek w języku specyfikacji mapowania (MSL) umieszcza warunki mapowania między modelem koncepcyjnym a bazą danych. Mapowanie zdefiniowane w węźle XML jest prawidłowe, jeśli spełnione są wszystkie warunki określone w elementach warunku podrzędnego. W przeciwnym razie mapowanie jest nieprawidłowe. Jeśli na przykład element MappingFragment zawiera co najmniej jeden element podrzędny Warunek, mapowanie zdefiniowane w węźle MappingFragment będzie prawidłowe tylko wtedy, gdy zostaną spełnione wszystkie warunki elementów warunku podrzędnego.

Każdy warunek może być stosowany do nazwy (nazwy właściwości jednostki modelu koncepcyjnego, określonej przez atrybut Name) lub ColumnName (nazwa kolumny w bazie danych, określonej przez atrybut ColumnName). Po ustawieniu atrybutu Name warunek jest sprawdzany względem wartości właściwości jednostki. Po ustawieniu atrybutu ColumnName warunek jest sprawdzany względem wartości kolumny. W elemecie Warunek można określić tylko jeden z atrybutów Name lub ColumnName.

Uwaga

Gdy element Condition jest używany w elemecie FunctionImportMapping, nie ma zastosowania tylko atrybut Name.

Element Warunek może być elementem podrzędnym następujących elementów:

  • AssociationSetMapping
  • Complexproperty
  • EntitySetMapping
  • Mapowaniefragment
  • EntityTypeMapping

Element Warunek nie może mieć elementów podrzędnych.

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu Warunek :

Nazwa atrybutu Jest wymagany Wartość
Columnname Nie. Nazwa kolumny tabeli, której wartość jest używana do oceny warunku.
Isnull Nie. True lub False. Jeśli wartość ma wartość True, a wartość kolumny ma wartość null lub wartośćfalse, a wartość kolumny nie ma wartości null, warunek ma wartość true. W przeciwnym razie warunek ma wartość false.
Atrybuty IsNull i Value nie mogą być używane w tym samym czasie.
Wartość Nie. Wartość, z którą jest porównywana wartość kolumny. Jeśli wartości są takie same, warunek ma wartość true. W przeciwnym razie warunek ma wartość false.
Atrybuty IsNull i Value nie mogą być używane w tym samym czasie.
Nazwa/nazwisko Nie. Nazwa właściwości jednostki modelu koncepcyjnego, której wartość jest używana do oceny warunku.
Ten atrybut nie ma zastosowania, jeśli element Condition jest używany w elemecie FunctionImportMapping.

Przykład

W poniższym przykładzie przedstawiono elementy Warunek jako elementy podrzędne elementów MappingFragment . Jeśli właściwość HireDate nie ma wartości null, a właściwość EnrollmentDate ma wartość null, dane są mapowane między typem SchoolModel.Instructor a kolumnami PersonID i HireDate w tabeli Person. Jeśli właściwość EnrollmentDate nie ma wartości null, a właściwość HireDate ma wartość null, dane są mapowane między typem SchoolModel.Student a kolumnami PersonID i Enrollment tabeli PersonID.

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

Element DeleteFunction w języku specyfikacji mapowania (MSL) mapuje funkcję usuwania typu jednostki lub skojarzenia w modelu koncepcyjnym na procedurę składowaną w bazowej bazie danych. Procedury składowane, do których są mapowane funkcje modyfikacji, muszą być zadeklarowane w modelu magazynu. Aby uzyskać więcej informacji, zobacz Function, Element (SSDL).

Uwaga

Jeśli nie zamapujesz wszystkich trzech operacji wstawiania, aktualizowania lub usuwania typu jednostki do procedur składowanych, niezmapowane operacje nie zostaną wykonane w czasie wykonywania, a wyjątek UpdateException zostanie zgłoszony.

Funkcja DeleteFunction zastosowana do elementu EntityTypeMapping

Po zastosowaniu do elementu EntityTypeMapping element DeleteFunction mapuje funkcję usuwania typu jednostki w modelu koncepcyjnym na procedurę składowaną.

Element DeleteFunction może mieć następujące elementy podrzędne po zastosowaniu do elementu EntityTypeMapping :

  • AssociationEnd (zero lub więcej)
  • ComplexProperty (zero lub więcej)
  • ScalarProperty (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu DeleteFunction po zastosowaniu do elementu EntityTypeMapping.

Nazwa atrybutu Jest wymagany Wartość
Functionname Tak Kwalifikowana nazwa przestrzeni nazw procedury składowanej, do której jest mapowana funkcja delete. Procedura składowana musi być zadeklarowana w modelu magazynu.
Wiersze, których dotyczy parametr Nie. Nazwa parametru wyjściowego zwracającego liczbę wierszy, których dotyczy problem.

Przykład

Poniższy przykład jest oparty na modelu School i pokazuje element DeleteFunction mapowanie funkcji delete typu jednostki Person na procedurę składowaną DeletePerson . Procedura składowana DeletePerson jest zadeklarowana w modelu magazynu.

 <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 zastosowane do elementu AssociationSetMapping

Po zastosowaniu do elementu AssociationSetMapping element DeleteFunction mapuje funkcję delete skojarzenia w modelu koncepcyjnym na procedurę składowaną.

Element DeleteFunction może mieć następujące elementy podrzędne po zastosowaniu do elementu AssociationSetMapping :

  • EndProperty

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu DeleteFunction po zastosowaniu do elementu AssociationSetMapping.

Nazwa atrybutu Jest wymagany Wartość
Functionname Tak Kwalifikowana nazwa przestrzeni nazw procedury składowanej, do której jest mapowana funkcja delete. Procedura składowana musi być zadeklarowana w modelu magazynu.
Wiersze, których dotyczy parametr Nie. Nazwa parametru wyjściowego zwracającego liczbę wierszy, których dotyczy problem.

Przykład

Poniższy przykład jest oparty na modelu School i pokazuje element DeleteFunction używany do mapowania funkcji usuwania skojarzenia CourseInstructor do procedury składowanej DeleteCourseInstructor. Procedura składowana DeleteCourseInstructor jest zadeklarowana w modelu magazynu.

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

Element EndProperty w języku specyfikacji mapowania (MSL) definiuje mapowanie między funkcją końcową lub modyfikacją skojarzenia modelu koncepcyjnego i bazowej bazy danych. Mapowanie kolumn właściwości jest określone w podrzędnym elemecie ScalarProperty.

Gdy element EndProperty jest używany do definiowania mapowania dla końca skojarzenia modelu koncepcyjnego, jest elementem podrzędnym elementu AssociationSetMapping. Gdy element EndProperty jest używany do definiowania mapowania dla funkcji modyfikacji skojarzenia modelu koncepcyjnego, jest elementem podrzędnym elementu InsertFunction lub elementu DeleteFunction.

Element EndProperty może mieć następujące elementy podrzędne:

  • ScalarProperty (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu EndProperty :

Nazwa atrybutu Jest wymagany Wartość
Imię i nazwisko/nazwa Tak Nazwa końca skojarzenia mapowanego.

Przykład

W poniższym przykładzie pokazano element AssociationSetMapping , w którym skojarzenie FK_Course_Department w modelu koncepcyjnym jest mapowane na tabelę Course w bazie danych. Mapowania między właściwościami typu skojarzenia i kolumnami tabeli są określone w podrzędnych elementach EndProperty .

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

Przykład

W poniższym przykładzie przedstawiono element EndProperty mapowanie funkcji wstawiania i usuwania skojarzenia (CourseInstructor) do procedur składowanych w bazowej bazie danych. Funkcje mapowane na są deklarowane w modelu magazynu.

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

Element EntityContainerMapping w języku specyfikacji mapowania (MSL) mapuje kontener jednostek w modelu koncepcyjnym na kontener jednostki w modelu magazynu. Element EntityContainerMapping jest elementem podrzędnym elementu Mapowanie.

Element EntityContainerMapping może zawierać następujące elementy podrzędne (w podanej kolejności):

  • EntitySetMapping (zero lub więcej)
  • AssociationSetMapping (zero lub więcej)
  • FunctionImportMapping (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu EntityContainerMapping .

Nazwa atrybutu Jest wymagany Wartość
StorageModelContainer Tak Nazwa kontenera jednostki modelu magazynu, który jest mapowany.
CdmEntityContainer Tak Nazwa kontenera jednostki modelu koncepcyjnego, który jest mapowany.
GenerateUpdateViews Nie. True lub False. Jeśli wartość Fałsz, nie są generowane żadne widoki aktualizacji. Ten atrybut powinien być ustawiony na wartość Fałsz , jeśli istnieje mapowanie tylko do odczytu, które byłoby nieprawidłowe, ponieważ dane mogą nie być pomyślnie zaokrąglone.
Wartość domyślna to True.

Przykład

Poniższy przykład przedstawia element EntityContainerMapping mapujący kontener SchoolModelEntities (kontener jednostki modelu koncepcyjnego) do kontenera SchoolModelStoreContainer (kontener jednostki modelu magazynu):

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

Element EntitySetMapping w języku specyfikacji mapowania (MSL) mapuje wszystkie typy w jednostce modelu koncepcyjnego na zestawy jednostek w modelu magazynu. Zestaw jednostek w modelu koncepcyjnym jest kontenerem logicznym dla wystąpień jednostek tego samego typu (i typów pochodnych). Jednostka ustawiona w modelu magazynu reprezentuje tabelę lub widok w bazowej bazie danych. Zestaw jednostek modelu koncepcyjnego jest określany przez wartość atrybutu Name elementu EntitySetMapping . Zamapowany do tabeli lub widoku jest określany przez atrybut StoreEntitySet w każdym podrzędnym elemenie MappingFragment lub w samym elemecie EntitySetMapping .

Element EntitySetMapping może mieć następujące elementy podrzędne:

  • EntityTypeMapping (zero lub więcej)
  • QueryView (zero lub jeden)
  • MappingFragment (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu EntitySetMapping .

Nazwa atrybutu Jest wymagany Wartość
Nazwa/nazwisko Tak Nazwa mapowanego zestawu jednostek modelu koncepcyjnego.
TypeName1 Nie. Nazwa mapowanego typu jednostki modelu koncepcyjnego.
StoreEntitySet1 Nie. Nazwa zestawu jednostek modelu magazynu, który jest mapowany na.
MakeColumnsDistinct Nie. Prawda czy fałsz w zależności od tego, czy zwracane są tylko odrębne wiersze.
Jeśli ten atrybut ma wartość True, atrybut GenerateUpdateViews elementu EntityContainerMapping musi mieć wartość False.

 

1 Atrybuty TypeName i StoreEntitySet mogą być używane zamiast elementów podrzędnych EntityTypeMapping i MappingFragment w celu mapowania pojedynczego typu jednostki na jedną tabelę.

Przykład

W poniższym przykładzie przedstawiono element EntitySetMapping , który mapuje trzy typy (typ podstawowy i dwa typy pochodne) w zestawie jednostek Courses modelu koncepcyjnego na trzy różne tabele w bazowej bazie danych. Tabele są określane przez atrybut StoreEntitySet w każdym elemecie 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>

EntityTypeMapping, element (MSL)

Element EntityTypeMapping w języku specyfikacji mapowania (MSL) definiuje mapowanie między typem jednostki w modelu koncepcyjnym i tabelach lub widokach w bazowej bazie danych. Aby uzyskać informacje na temat typów jednostek modelu koncepcyjnego i bazowych tabel baz danych lub widoków, zobacz EntityType, Element (CSDL) i EntitySet, Element (SSDL). Typ jednostki modelu koncepcyjnego mapowany jest określony przez atrybut TypeName elementu EntityTypeMapping. Tabela lub widok mapowany jest określony przez atrybut StoreEntitySet elementu MapFragment podrzędny.

Element podrzędny ModificationFunctionMapping może służyć do mapowania funkcji wstawiania, aktualizowania lub usuwania typów jednostek do procedur składowanych w bazie danych.

Element EntityTypeMapping może mieć następujące elementy podrzędne:

  • MappingFragment (zero lub więcej)
  • ModificationFunctionMapping (zero lub jeden)
  • Właściwość skalarna
  • Stan

Uwaga

Element MappingFragment i ModificationFunctionMapping nie może być elementami podrzędnym elementu EntityTypeMapping jednocześnie.

Uwaga

Elementy ScalarProperty i Condition mogą być elementami podrzędnym elementu EntityTypeMapping, gdy jest używany w elemecie FunctionImportMapping.

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu EntityTypeMapping .

Nazwa atrybutu Jest wymagany Wartość
Typename Tak Kwalifikowana nazwa przestrzeni nazw typu jednostki modelu koncepcyjnego, który jest mapowany.
Jeśli typ jest abstrakcyjny lub typ pochodny, wartość musi mieć wartość IsOfType(Namespace-qualified_type_name).

Przykład

Poniższy przykład przedstawia element EntitySetMapping z dwoma podrzędnymi elementami EntityTypeMapping . W pierwszym elemecie EntityTypeMapping typ jednostki SchoolModel.Person jest mapowany na tabelę Person. W drugim elemenie EntityTypeMapping funkcja aktualizacji typu SchoolModel.Person jest mapowana na procedurę składowaną UpdatePerson w bazie danych.

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

Przykład

W następnym przykładzie pokazano mapowanie hierarchii typów, w której typ główny jest abstrakcyjny. Zwróć uwagę na IsOfType użycie składni atrybutów 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>

FunctionImportMapping, element (MSL)

Element FunctionImportMapping w języku specyfikacji mapowania (MSL) definiuje mapowanie między importowaniem funkcji w modelu koncepcyjnym a procedurą składowaną lub funkcją w bazowej bazie danych. Importy funkcji muszą być zadeklarowane w modelu koncepcyjnym, a procedury składowane muszą być zadeklarowane w modelu magazynu. Aby uzyskać więcej informacji, zobacz FunctionImport, Element (CSDL) i Function, Element (SSDL).

Uwaga

Domyślnie jeśli import funkcji zwraca typ jednostki modelu koncepcyjnego lub typ złożony, nazwy kolumn zwracanych przez podstawową procedurę składowaną muszą dokładnie odpowiadać nazwam właściwości typu modelu koncepcyjnego. Jeśli nazwy kolumn nie są dokładnie zgodne z nazwami właściwości, mapowanie musi być zdefiniowane w elemecie ResultMapping.

Element FunctionImportMapping może mieć następujące elementy podrzędne:

  • ResultMapping (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu FunctionImportMapping :

Nazwa atrybutu Jest wymagany Wartość
FunctionImportName Tak Nazwa importowania funkcji w modelu koncepcyjnym, który jest mapowany.
Functionname Tak Kwalifikowana nazwa przestrzeni nazw funkcji w modelu magazynu, który jest mapowany.

Przykład

Poniższy przykład jest oparty na modelu School. Rozważmy następującą funkcję w modelu magazynu:

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

Rozważ również importowanie tej funkcji w modelu koncepcyjnym:

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

W poniższym przykładzie przedstawiono element FunctionImportMapping używany do mapowania funkcji i importowania funkcji na siebie nawzajem:

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

 

InsertFunction, element (MSL)

Element InsertFunction w języku specyfikacji mapowania (MSL) mapuje funkcję wstawiania typu jednostki lub skojarzenia w modelu koncepcyjnym na procedurę składowaną w bazowej bazie danych. Procedury składowane, do których są mapowane funkcje modyfikacji, muszą być zadeklarowane w modelu magazynu. Aby uzyskać więcej informacji, zobacz Function, Element (SSDL).

Uwaga

Jeśli nie zamapujesz wszystkich trzech operacji wstawiania, aktualizowania lub usuwania typu jednostki do procedur składowanych, niezmapowane operacje nie zostaną wykonane w czasie wykonywania, a wyjątek UpdateException zostanie zgłoszony.

Element InsertFunction może być elementem podrzędnym elementu ModificationFunctionMapping i zastosowanym do elementu EntityTypeMapping lub elementu AssociationSetMapping.

InsertFunction Zastosowane do entityTypeMapping

Po zastosowaniu do elementu EntityTypeMapping element InsertFunction mapuje funkcję wstawiania typu jednostki w modelu koncepcyjnym na procedurę składowaną.

Element InsertFunction może mieć następujące elementy podrzędne po zastosowaniu do elementu EntityTypeMapping :

  • AssociationEnd (zero lub więcej)
  • ComplexProperty (zero lub więcej)
  • ResultBinding (zero lub jeden)
  • ScalarProperty (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu InsertFunction po zastosowaniu do elementu EntityTypeMapping.

Nazwa atrybutu Jest wymagany Wartość
Functionname Tak Kwalifikowana nazwa przestrzeni nazw procedury składowanej, do której jest mapowana funkcja insert. Procedura składowana musi być zadeklarowana w modelu magazynu.
Wiersze, których dotyczy parametr Nie. Nazwa parametru wyjściowego zwracającego liczbę wierszy, których dotyczy problem.

Przykład

Poniższy przykład jest oparty na modelu School i pokazuje element InsertFunction używany do mapowania funkcji wstawiania typu jednostki Person do procedury składowanej InsertPerson . Procedura składowana InsertPerson jest zadeklarowana w modelu magazynu.

 <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 Zastosowano do elementu AssociationSetMapping

Po zastosowaniu do elementu AssociationSetMapping element InsertFunction mapuje funkcję wstawiania skojarzenia w modelu koncepcyjnym na procedurę składowaną.

Element InsertFunction może mieć następujące elementy podrzędne po zastosowaniu do elementu AssociationSetMapping :

  • EndProperty

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu InsertFunction po zastosowaniu do elementu AssociationSetMapping.

Nazwa atrybutu Jest wymagany Wartość
Functionname Tak Kwalifikowana nazwa przestrzeni nazw procedury składowanej, do której jest mapowana funkcja insert. Procedura składowana musi być zadeklarowana w modelu magazynu.
Wiersze, których dotyczy parametr Nie. Nazwa parametru wyjściowego zwracającego liczbę wierszy, których dotyczy problem.

Przykład

Poniższy przykład jest oparty na modelu School i pokazuje element InsertFunction używany do mapowania funkcji insert skojarzenia CourseInstructor do procedury składowanej InsertCourseInstructor. Procedura składowana InsertCourseInstructor jest zadeklarowana w modelu magazynu.

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

Element Mapowanie w języku specyfikacji mapowania (MSL) zawiera informacje dotyczące mapowania obiektów zdefiniowanych w modelu koncepcyjnym do bazy danych (zgodnie z opisem w modelu magazynu). Aby uzyskać więcej informacji, zobacz specyfikację CSDL i specyfikację SSDL.

Element Mapowanie jest elementem głównym specyfikacji mapowania. Przestrzeń nazw XML dla specyfikacji mapowania to https://schemas.microsoft.com/ado/2009/11/mapping/cs.

Element mapowania może zawierać następujące elementy podrzędne (w kolejności wymienionej):

  • Alias (zero lub więcej)
  • EntityContainerMapping (dokładnie jeden)

Nazwy typów modeli koncepcyjnych i magazynowych, do których odwołuje się biblioteka MSL, muszą być kwalifikowane przez odpowiednie nazwy przestrzeni nazw. Aby uzyskać informacje o nazwie przestrzeni nazw modelu koncepcyjnego, zobacz Element schematu (CSDL). Aby uzyskać informacje o nazwie przestrzeni nazw modelu magazynu, zobacz Element schematu (SSDL). Aliasy przestrzeni nazw używanych w języku MSL można zdefiniować za pomocą elementu Alias.

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu Mapowanie .

Nazwa atrybutu Jest wymagany Wartość
Space Tak C-S. Jest to stała wartość i nie można jej zmienić.

Przykład

W poniższym przykładzie przedstawiono element mapowania oparty na części modelu School. Aby uzyskać więcej informacji na temat modelu School, zobacz Szybki start (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)

Element MappingFragment w języku specyfikacji mapowania (MSL) definiuje mapowanie między właściwościami typu jednostki modelu koncepcyjnego a tabelą lub widokiem w bazie danych. Aby uzyskać informacje na temat typów jednostek modelu koncepcyjnego i bazowych tabel baz danych lub widoków, zobacz EntityType, Element (CSDL) i EntitySet, Element (SSDL). Element MappingFragment może być elementem podrzędnym elementu EntityTypeMapping lub EntitySetMapping.

Element MappingFragment może mieć następujące elementy podrzędne:

  • ComplexType (zero lub więcej)
  • ScalarProperty (zero lub więcej)
  • Warunek (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu MappingFragment .

Nazwa atrybutu Jest wymagany Wartość
StoreEntitySet Tak Nazwa tabeli lub widoku mapowanego.
MakeColumnsDistinct Nie. Prawda czy fałsz w zależności od tego, czy zwracane są tylko odrębne wiersze.
Jeśli ten atrybut ma wartość True, atrybut GenerateUpdateViews elementu EntityContainerMapping musi mieć wartość False.

Przykład

W poniższym przykładzie pokazano element MappingFragment jako element podrzędny elementu EntityTypeMapping . W tym przykładzie właściwości typu Course w modelu koncepcyjnym są mapowane na kolumny tabeli Course w bazie danych.

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

Przykład

W poniższym przykładzie pokazano element MappingFragment jako element podrzędny elementu EntitySetMapping . Podobnie jak w powyższym przykładzie właściwości typu Course w modelu koncepcyjnym są mapowane na kolumny tabeli Course w bazie danych.

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

Element ModificationFunctionMapping w języku specyfikacji mapowania (MSL) mapuje funkcje wstawiania, aktualizowania i usuwania typu jednostki modelu koncepcyjnego na procedury składowane w bazowej bazie danych. Element ModificationFunctionMapping może również mapować funkcje wstawiania i usuwania dla skojarzeń wiele-do-wielu w modelu koncepcyjnym na procedury składowane w bazowej bazie danych. Procedury składowane, do których są mapowane funkcje modyfikacji, muszą być zadeklarowane w modelu magazynu. Aby uzyskać więcej informacji, zobacz Function, Element (SSDL).

Uwaga

Jeśli nie zamapujesz wszystkich trzech operacji wstawiania, aktualizowania lub usuwania typu jednostki do procedur składowanych, niezmapowane operacje nie zostaną wykonane w czasie wykonywania, a wyjątek UpdateException zostanie zgłoszony.

Uwaga

Jeśli funkcje modyfikacji jednej jednostki w hierarchii dziedziczenia są mapowane na procedury składowane, należy zamapować funkcje modyfikacji dla wszystkich typów w hierarchii do procedur składowanych.

Element ModificationFunctionMapping może być elementem podrzędnym elementu EntityTypeMapping lub elementu AssociationSetMapping.

Element ModificationFunctionMapping może mieć następujące elementy podrzędne:

  • DeleteFunction (zero lub jeden)
  • InsertFunction (zero lub jeden)
  • UpdateFunction (zero lub jeden)

Do elementu ModificationFunctionMapping nie mają zastosowania żadne atrybuty.

Przykład

W poniższym przykładzie przedstawiono mapowanie zestawu jednostek dla jednostki Osoby ustawionej w modelu School. Oprócz mapowania kolumn dla typu jednostki Person są wyświetlane mapowanie funkcji wstawiania, aktualizowania i usuwania typu Osoba . Funkcje mapowane na są deklarowane w modelu magazynu.

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

Przykład

W poniższym przykładzie pokazano mapowanie zestawu skojarzeń dla skojarzenia CourseInstructor ustawionego w modelu School. Oprócz mapowania kolumn dla skojarzenia CourseInstructor są wyświetlane mapowanie funkcji wstawiania i usuwania skojarzenia CourseInstructor . Funkcje mapowane na są deklarowane w modelu magazynu.

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

Element QueryView w języku specyfikacji mapowania (MSL) definiuje mapowanie tylko do odczytu między typem jednostki lub skojarzeniem w modelu koncepcyjnym i tabelą w bazowej bazie danych. Mapowanie jest definiowane za pomocą zapytania Entity SQL, które jest oceniane względem modelu magazynu, i wyrażasz zestaw wyników pod względem jednostki lub skojarzenia w modelu koncepcyjnym. Ponieważ widoki zapytań są tylko do odczytu, nie można używać standardowych poleceń aktualizacji do aktualizowania typów zdefiniowanych przez widoki zapytań. Aktualizacje tych typów można wprowadzać przy użyciu funkcji modyfikacji. Aby uzyskać więcej informacji, zobacz Instrukcje: mapowanie funkcji modyfikacji na procedury składowane.

Uwaga

W elemecie QueryView wyrażenia SQL jednostki zawierające grupę, agregacje grup lub właściwości nawigacji nie są obsługiwane.

 

Element QueryView może być elementem podrzędnym elementu EntitySetMapping lub elementu AssociationSetMapping. W poprzednim przypadku widok zapytania definiuje mapowanie tylko do odczytu dla jednostki w modelu koncepcyjnym. W tym drugim przypadku widok zapytania definiuje mapowanie tylko do odczytu dla skojarzenia w modelu koncepcyjnym.

Uwaga

Jeśli element AssociationSetMapping jest dla skojarzenia z ograniczeniem odwołania, element AssociationSetMapping jest ignorowany. Aby uzyskać więcej informacji, zobacz ReferentialConstraint, element (CSDL).

Element QueryView nie może mieć żadnych elementów podrzędnych.

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu QueryView .

Nazwa atrybutu Jest wymagany Wartość
Typename Nie. Nazwa typu modelu koncepcyjnego mapowanego przez widok zapytania.

Przykład

Poniższy przykład przedstawia element QueryView jako element podrzędny elementu EntitySetMapping i definiuje mapowanie widoku zapytania dla typu jednostki Dział w modelu szkolnym.

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

Ponieważ zapytanie zwraca tylko podzbiór członków typu Department w modelu magazynu, typ Działu w modelu Szkoły został zmodyfikowany na podstawie tego mapowania w następujący sposób:

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

Przykład

W następnym przykładzie pokazano element QueryView jako element podrzędny elementu AssociationSetMapping i definiuje mapowanie tylko do odczytu dla FK_Course_Department skojarzenia w modelu 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>

 

Komentarze

Widoki zapytań można zdefiniować, aby włączyć następujące scenariusze:

  • Zdefiniuj jednostkę w modelu koncepcyjnym, który nie zawiera wszystkich właściwości jednostki w modelu magazynu. Obejmuje to właściwości, które nie mają wartości domyślnych i nie obsługują wartości null .
  • Mapowanie kolumn obliczeniowych w modelu magazynu na właściwości typów jednostek w modelu koncepcyjnym.
  • Zdefiniuj mapowanie, w którym warunki używane do partycjonowania jednostek w modelu koncepcyjnym nie są oparte na równości. Po określeniu mapowania warunkowego przy użyciu elementu Warunek podany warunek musi być równy określonej wartości. Aby uzyskać więcej informacji, zobacz Condition, Element (MSL).
  • Zamapuj tę samą kolumnę w modelu magazynu na wiele typów w modelu koncepcyjnym.
  • Mapuj wiele typów na tę samą tabelę.
  • Zdefiniuj skojarzenia w modelu koncepcyjnym, które nie są oparte na kluczach obcych w schemacie relacyjnym.
  • Użyj niestandardowej logiki biznesowej, aby ustawić wartość właściwości w modelu koncepcyjnym. Można na przykład zamapować wartość ciągu "T" w źródle danych na wartość true, wartość logiczną w modelu koncepcyjnym.
  • Zdefiniuj filtry warunkowe dla wyników zapytania.
  • Wymuszanie mniejszej liczby ograniczeń dotyczących danych w modelu koncepcyjnym niż w modelu magazynu. Można na przykład utworzyć właściwość w modelu koncepcyjnym dopuszczający wartość null, nawet jeśli kolumna, do której jest mapowana, nie obsługuje wartości null.

Podczas definiowania widoków zapytań dla jednostek mają zastosowanie następujące kwestie:

  • Widoki zapytań są tylko do odczytu. Aktualizacje jednostek można wprowadzać tylko za pomocą funkcji modyfikacji.
  • Podczas definiowania typu jednostki przez widok zapytania należy również zdefiniować wszystkie powiązane jednostki według widoków zapytań.
  • W przypadku mapowania skojarzenia wiele-do-wielu do jednostki w modelu magazynu, który reprezentuje tabelę łączy w schemacie relacyjnym, należy zdefiniować element QueryView w elemecie AssociationSetMapping dla tej tabeli linków.
  • Widoki zapytań muszą być zdefiniowane dla wszystkich typów w hierarchii typów. Można to zrobić w następujący sposób:
    • W przypadku pojedynczego elementu QueryView , który określa pojedyncze zapytanie SQL jednostki, które zwraca związek wszystkich typów jednostek w hierarchii.
    • W przypadku pojedynczego elementu QueryView , który określa pojedyncze zapytanie SQL jednostki, które używa operatora CASE do zwrócenia określonego typu jednostki w hierarchii na podstawie określonego warunku.
    • Z dodatkowym elementem QueryView dla określonego typu w hierarchii. W takim przypadku użyj atrybutu TypeName elementu QueryView, aby określić typ jednostki dla każdego widoku.
  • Po zdefiniowaniu widoku zapytania nie można określić atrybutu StorageSetName w elemecie EntitySetMapping .
  • Po zdefiniowaniu widoku zapytania element EntitySetMappingnie może również zawierać mapowań właściwości .

ResultBinding, element (MSL)

Element ResultBinding w języku specyfikacji mapowania (MSL) mapuje wartości kolumn zwracane przez procedury składowane do właściwości jednostki w modelu koncepcyjnym, gdy funkcje modyfikacji typu jednostki są mapowane na procedury składowane w bazowej bazie danych. Na przykład gdy wartość kolumny tożsamości jest zwracana przez wstawioną procedurę składowaną, element ResultBinding mapuje zwróconą wartość na właściwość typu jednostki w modelu koncepcyjnym.

Element ResultBinding może być elementem podrzędnym elementu InsertFunction lub updateFunction.

Element ResultBinding nie może mieć żadnych elementów podrzędnych.

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu ResultBinding :

Nazwa atrybutu Jest wymagany Wartość
Nazwa/nazwisko Tak Nazwa właściwości jednostki w modelu koncepcyjnym, który jest mapowany.
Columnname Tak Nazwa mapowanej kolumny.

Przykład

Poniższy przykład jest oparty na modelu School i pokazuje element InsertFunction używany do mapowania funkcji insert typu jednostki Person do procedury składowanej InsertPerson . (Procedura składowana InsertPerson jest pokazana poniżej i jest zadeklarowana w modelu magazynu). Element ResultBinding służy do mapowania wartości kolumny zwracanej przez procedurę składowaną (NewPersonID) na właściwość typu jednostki (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>

W poniższym języku Transact-SQL opisano procedurę składowaną 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;

ResultMapping, element (MSL)

Element ResultMapping w języku specyfikacji mapowania (MSL) definiuje mapowanie między importowaniem funkcji w modelu koncepcyjnym a procedurą składowaną w bazowej bazie danych, gdy są spełnione następujące warunki:

  • Importowanie funkcji zwraca typ jednostki modelu koncepcyjnego lub typ złożony.
  • Nazwy kolumn zwracanych przez procedurę składowaną nie są dokładnie zgodne z nazwami właściwości typu jednostki lub typu złożonego.

Domyślnie mapowanie między kolumnami zwracanym przez procedurę składowaną i typem jednostki lub typem złożonym jest oparte na nazwach kolumn i właściwości. Jeśli nazwy kolumn nie są dokładnie zgodne z nazwami właściwości, należy użyć elementu ResultMapping do zdefiniowania mapowania. Aby zapoznać się z przykładem mapowania domyślnego, zobacz FunctionImportMapping, element (MSL).

Element ResultMapping jest elementem podrzędnym elementu FunctionImportMapping.

Element ResultMapping może mieć następujące elementy podrzędne:

  • EntityTypeMapping (zero lub więcej)
  • ComplexTypeMapping

Żadne atrybuty nie mają zastosowania do elementu ResultMapping .

Przykład

Rozważ następującą procedurę składowaną:

 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

Rozważ również następujący typ jednostki modelu koncepcyjnego:

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

Aby utworzyć importowanie funkcji zwracającej wystąpienia poprzedniego typu jednostki, mapowanie między kolumnami zwróconymi przez procedurę składowaną i typem jednostki musi być zdefiniowane w elemecie 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>

ScalarProperty, element (MSL)

Element ScalarProperty w języku specyfikacji mapowania (MSL) mapuje właściwość na typ jednostki modelu koncepcyjnego, typ złożony lub skojarzenie do kolumny tabeli lub parametru procedury składowanej w bazowej bazie danych.

Uwaga

Procedury składowane, do których są mapowane funkcje modyfikacji, muszą być zadeklarowane w modelu magazynu. Aby uzyskać więcej informacji, zobacz Function, Element (SSDL).

Element ScalarProperty może być elementem podrzędnym następujących elementów:

  • Mapowaniefragment
  • InsertFunction
  • UpdateFunction
  • DeleteFunction
  • EndProperty
  • Complexproperty
  • ResultMapping

Jako element podrzędny elementu MappingFragment, ComplexProperty lub EndProperty element ScalarProperty mapuje właściwość w modelu koncepcyjnym na kolumnę w bazie danych. Jako element podrzędny elementu InsertFunction, UpdateFunction lub DeleteFunction element ScalarProperty mapuje właściwość w modelu koncepcyjnym na parametr procedury składowanej.

Element ScalarProperty nie może mieć żadnych elementów podrzędnych.

Odpowiednie atrybuty

Atrybuty stosowane do elementu ScalarProperty różnią się w zależności od roli elementu.

W poniższej tabeli opisano atrybuty, które mają zastosowanie, gdy element ScalarProperty jest używany do mapowania właściwości modelu koncepcyjnego na kolumnę w bazie danych:

Nazwa atrybutu Jest wymagany Wartość
Nazwa/nazwisko Tak Nazwa właściwości modelu koncepcyjnego, która jest mapowana.
Columnname Tak Nazwa kolumny tabeli, która jest mapowana.

W poniższej tabeli opisano atrybuty, które mają zastosowanie do elementu ScalarProperty , gdy jest on używany do mapowania właściwości modelu koncepcyjnego na parametr procedury składowanej:

Nazwa atrybutu Jest wymagany Wartość
Nazwa/nazwisko Tak Nazwa właściwości modelu koncepcyjnego, która jest mapowana.
Parametername Tak Nazwa mapowanego parametru.
Wersja Nie. Bieżący lub oryginalny w zależności od tego, czy bieżąca wartość lub oryginalna wartość właściwości powinna być używana do sprawdzania współbieżności.

Przykład

Poniższy przykład przedstawia element ScalarProperty używany na dwa sposoby:

  • Aby zamapować właściwości typu jednostki Person na kolumny tabeli Person.
  • Aby zamapować właściwości typu jednostki Person na parametry procedury składowanej UpdatePerson . Procedury składowane są deklarowane w modelu magazynu.
 <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>

Przykład

W następnym przykładzie przedstawiono element ScalarProperty używany do mapowania funkcji wstawiania i usuwania skojarzenia modelu koncepcyjnego z procedurami składowanymi w bazie danych. Procedury składowane są deklarowane w modelu magazynu.

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

Element UpdateFunction w języku specyfikacji mapowania (MSL) mapuje funkcję aktualizacji typu jednostki w modelu koncepcyjnym na procedurę składowaną w bazowej bazie danych. Procedury składowane, do których są mapowane funkcje modyfikacji, muszą być zadeklarowane w modelu magazynu. Aby uzyskać więcej informacji, zobacz Function, Element (SSDL).

Uwaga

Jeśli nie zamapujesz wszystkich trzech operacji wstawiania, aktualizowania lub usuwania typu jednostki do procedur składowanych, niezmapowane operacje nie zostaną wykonane w czasie wykonywania, a wyjątek UpdateException zostanie zgłoszony.

Element UpdateFunction może być elementem podrzędnym elementu ModificationFunctionMapping i zastosowanym do elementu EntityTypeMapping.

Element UpdateFunction może mieć następujące elementy podrzędne:

  • AssociationEnd (zero lub więcej)
  • ComplexProperty (zero lub więcej)
  • ResultBinding (zero lub jeden)
  • ScalarProperty (zero lub więcej)

Odpowiednie atrybuty

W poniższej tabeli opisano atrybuty, które można zastosować do elementu UpdateFunction .

Nazwa atrybutu Jest wymagany Wartość
Functionname Tak Kwalifikowana nazwa przestrzeni nazw procedury składowanej, do której jest mapowana funkcja update. Procedura składowana musi być zadeklarowana w modelu magazynu.
Wiersze, których dotyczy parametr Nie. Nazwa parametru wyjściowego zwracającego liczbę wierszy, których dotyczy problem.

Przykład

Poniższy przykład jest oparty na modelu School i pokazuje element UpdateFunction używany do mapowania funkcji aktualizacji typu jednostki Person do procedury składowanej UpdatePerson . Procedura składowana UpdatePerson jest zadeklarowana w modelu magazynu.

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