Спецификация MSL

Язык спецификации сопоставления (MSL) — это xml-язык, описывающий сопоставление концептуальной модели и модели хранения приложения Entity Framework.

В приложении Entity Framework метаданные сопоставления загружаются из MSL-файла (записанного в MSL) во время сборки. Entity Framework использует метаданные сопоставления во время выполнения для перевода запросов к концептуальной модели в команды, относящиеся к хранилищу.

Конструктор Entity Framework (EF Designer) сохраняет сведения о сопоставлении в edmx-файле во время разработки. Во время сборки конструктор сущностей использует сведения в edmx-файле для создания MSL-файла, необходимого Entity Framework во время выполнения.

Имена всех типов концептуальной модели или модели хранения, которые упоминаются в языке MSL, должны указываться вместе с именами соответствующих пространств имен. Сведения о имени пространства имен концептуальной модели см . в спецификации CSDL. Сведения о имени пространства имен модели хранилища см . в спецификации SSDL.

Версии MSL отличаются пространствами имен XML.

Версия MSL Пространство имен XML
MSL версии 1 urn:schemas-microsoft-com:windows:storage:mapping:CS
MSL версии 2 https://schemas.microsoft.com/ado/2008/09/mapping/cs
MSL версии 3 https://schemas.microsoft.com/ado/2009/11/mapping/cs

Элемент Alias (язык MSL)

Элемент Alias в языке спецификации сопоставления (MSL) является дочерним элементом элемента Сопоставления, который используется для определения псевдонимов для концептуальной модели и пространств имен модели хранения. Имена всех типов концептуальной модели или модели хранения, которые упоминаются в языке MSL, должны указываться вместе с именами соответствующих пространств имен. Сведения о имени пространства имен концептуальной модели см. в разделе "Элемент схемы" (CSDL). Сведения о имени пространства имен модели хранилища см. в разделе "Элемент схемы" (SSDL).

Элемент Alias не может содержать дочерние элементы.

Применимые атрибуты

В приведенной ниже таблице описаны атрибуты, которые можно применить к элементу Alias .

Имя атрибута Обязательно Значение
Ключ Да Псевдоним пространства имен, указанного атрибутом Value .
Значение Да Пространство имен, для которого значение элемента Key является псевдонимом.

Пример

В следующем примере показан элемент Alias , определяющий псевдоним, cдля типов, определенных в концептуальной модели.

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

Элемент AssociationEnd в языке спецификации сопоставления (MSL) используется при сопоставлении функций изменения типа сущности в концептуальной модели с хранимыми процедурами в базовой базе данных. Если хранимая процедура изменения принимает параметр, значение которого хранится в свойстве ассоциации, элемент AssociationEnd сопоставляет значение свойства с параметром. Дополнительные сведения см. в приведенных ниже примерах.

Дополнительные сведения о сопоставлении функций изменения типов сущностей с хранимыми процедурами см. в разделе "Элемент ModificationFunctionMapping" (MSL) и пошаговое руководство. Сопоставление сущности с хранимыми процедурами.

Элемент AssociationEnd может иметь следующие дочерние элементы:

  • ScalarProperty

Применимые атрибуты

В следующей таблице описываются атрибуты, применимые к элементу AssociationEnd .

Имя атрибута Обязательно Значение
AssociationSet Да Имя сопоставляемой ассоциации.
From Да Значение атрибута FromRole свойства навигации, соответствующего сопоставлению сопоставления. Дополнительные сведения см. в разделе "Элемент NavigationProperty" (CSDL).
Кому Да Значение атрибута ToRole свойства навигации, соответствующего сопоставлению связи. Дополнительные сведения см. в разделе "Элемент NavigationProperty" (CSDL).

Пример

Рассмотрим следующий тип сущности в концептуальной модели:

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

Предположим, имеется следующая хранимая процедура:

 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;

Чтобы сопоставить функцию обновления сущности Course с этой хранимой процедурой, необходимо указать значение параметру DepartmentID . Значение для DepartmentID не соответствует свойству типа сущности. Оно содержится в независимом сопоставлении с сопоставлением, показанным ниже:

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

В следующем коде показан элемент AssociationEnd, используемый для сопоставления свойства DepartmentID FK_Course_Department связи с хранимой процедурой UpdateCourse (с которой сопоставляется функция обновления типа сущности 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 (MSL)

Элемент AssociationSetMapping в языке спецификации сопоставления (MSL) определяет сопоставление связей в концептуальной модели и столбцах таблицы в базовой базе данных.

Сопоставления в концептуальной модели — это типы, свойства которых представляют столбцы первичного и внешнего ключа в основной базе данных. Элемент AssociationSetMapping использует два элемента EndProperty для определения сопоставлений свойств типа ассоциации и столбцов в базе данных. Условия можно поместить в эти сопоставления с элементом Condition. Сопоставляйте функции вставки, обновления и удаления для связей с хранимыми процедурами в базе данных с элементом ModificationFunctionMapping. Определение сопоставлений только для чтения и столбцов таблиц с помощью строки Entity SQL в элементе QueryView.

Примечание.

Если для сопоставления в концептуальной модели определено ограничение ссылки, связь не должна сопоставляться с элементом AssociationSetMapping . Если элемент AssociationSetMapping присутствует для ассоциации, которая имеет референциальное ограничение, сопоставления, определенные в элементе AssociationSetMapping, будут игнорироваться. Дополнительные сведения см. в разделе "Элемент ReferentialConstraint" (CSDL).

Элемент AssociationSetMapping может содержать следующие дочерние элементы.

  • QueryView (ноль или один)
  • EndProperty (ноль или два)
  • Условие (ноль или больше)
  • ModificationFunctionMapping (ноль или один)

Применимые атрибуты

В следующей таблице описаны атрибуты, которые можно применить к элементу AssociationSetMapping .

Имя атрибута Обязательно Значение
Название Да Имя набора ассоциаций концептуальной модели, с которым выполняется сопоставление.
Typename No Имя типа ассоциации концептуальной модели из полного пространства имен, с которым выполняется сопоставление.
StoreEntitySet No Имя таблицы, с которой производится сопоставление.

Пример

В следующем примере показан элемент AssociationSetMapping , в котором набор сопоставлений FK_Course_Department в концептуальной модели сопоставляется с таблицей Course в базе данных. Сопоставления между свойствами типа связи и столбцами таблицы указываются в дочерних элементах 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 (MSL)

Элемент ComplexProperty в языке спецификации сопоставления (MSL) определяет сопоставление между свойством сложного типа для типа сущности концептуальной модели и столбцами таблицы в базовой базе данных. Сопоставления столбцов свойств указываются в дочерних элементах ScalarProperty.

Элемент свойства ComplexType может иметь следующие дочерние элементы:

  • ScalarProperty (ноль или более)
  • ComplexProperty (ноль или более)
  • ComplexTypeMapping (ноль или больше)
  • Условие (ноль или больше)

Применимые атрибуты

В следующей таблице описаны атрибуты, применимые к элементу ComplexProperty :

Имя атрибута Обязательно Значение
Название Да Имя сложного свойства типа сущности в концептуальной модели, с которым выполняется сопоставление.
Typename No Полное имя пространства имен типа свойства концептуальной модели.

Пример

Следующий пример основан на модели School. К концептуальной модели добавлен следующий сложный тип.

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

Свойства LastName и FirstName типа сущности Person были заменены одним сложным свойством 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>

В следующем MSL показан элемент ComplexProperty , используемый для сопоставления свойства Name со столбцами в базовой базе данных:

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

Элемент ComplexTypeMapping в языке спецификации сопоставления (MSL) является дочерним элементом элемента ResultMapping и определяет сопоставление между импортом функции в концептуальной модели и хранимой процедурой в базовой базе данных, если указано следующее:

  • Импорт функции возвращает концептуальный сложный тип.
  • Имена столбцов, возвращаемые хранимой процедурой, не соответствуют в точности именам свойств в сложном типе.

По умолчанию сопоставление между столбцами, возвращаемыми хранимой процедурой, и сложным типом основано на именах столбцов и свойств. Если имена столбцов не совпадают с именами свойств, необходимо использовать элемент ComplexTypeMapping для определения сопоставления. Пример сопоставления по умолчанию см. в разделе FunctionImportMapping Element (MSL).

Элемент ComplexTypeMapping может содержать следующие дочерние элементы:

  • ScalarProperty (ноль или более)

Применимые атрибуты

В следующей таблице описываются атрибуты, применимые к элементу ComplexTypeMapping .

Имя атрибута Обязательно Значение
Typename Да Имя сопоставляемого сложного типа с указанием пространства имен.

Пример

Рассмотрим следующую хранимую процедуру:

 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

Следует также обратить внимание на следующий сложный тип концептуальной модели:

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

Чтобы создать импорт функции, возвращающий экземпляры предыдущего сложного типа, сопоставление столбцов, возвращаемых хранимой процедурой, и тип сущности должен быть определен в элементе 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 (MSL)

Элемент Condition в языке спецификации сопоставления (MSL) помещает условия для сопоставления между концептуальной моделью и базовой базой данных. Сопоставление, определенное внутри XML-узла, допустимо, если выполняются все условия, указанные в дочерних элементах условия . В противном случае сопоставление недействительно. Например, если элемент MappingFragment содержит один или несколько дочерних элементов Condition , сопоставление, определенное в узле MappingFragment , будет допустимо только в том случае, если выполнены все условия дочерних элементов условия .

Каждое условие может применяться либо кимени (имени свойства сущности концептуальной модели, заданного атрибутом Name), либо columnName (имя столбца в базе данных, указанного атрибутом ColumnName). Если задан атрибут Name, условие проверка со значением свойства сущности. Если задан атрибут ColumnName, условие проверка к значению столбца. В элементе Condition можно указать только один из атрибутов Name или ColumnName.

Примечание.

Если элемент Condition используется в элементе FunctionImportMapping, применяется только атрибут Name.

Элемент Condition может быть дочерним элементом следующих элементов:

  • AssociationSetMapping
  • ComplexProperty
  • EntitySetMapping
  • MappingFragment
  • EntityTypeMapping

Элемент Condition не может содержать дочерних элементов.

Применимые атрибуты

В следующей таблице описываются атрибуты, применимые к элементу Condition :

Имя атрибута Обязательно Значение
ColumnName No Имя столбца таблицы, значение которого используется для оценки условия.
IsNull No true или false. Если значение равно True, а значение столбца равно NULL, или если значение равно False, а значение столбца не равно NULL, условие имеет значение true. В противном случае условие имеет значение false.
Атрибуты IsNull и Value нельзя использовать одновременно.
Значение No Значение, с которым сравнивается значение столбца. Если значения совпадают, условие верно. В противном случае условие имеет значение false.
Атрибуты IsNull и Value нельзя использовать одновременно.
Название No Имя свойства сущности концептуальной модели, значение которого используется для оценки условия.
Этот атрибут неприменимо, если элемент Condition используется в элементе FunctionImportMapping.

Пример

В следующем примере показаны элементы Condition в виде дочерних элементов MappingFragment . Если HireDate не имеет значения NULL, а РегистрацияDate имеет значение NULL, данные сопоставляются между типом SchoolModel.Instructor и столбцами PersonID и HireDate таблицы PersonDate. Если Параметр EnrollmentDate не имеет значения NULL, и HireDate имеет значение NULL, данные сопоставляются между типом SchoolModel.Student и столбцами PersonID и регистрациейтаблицы Person.

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

Элемент DeleteFunction (MSL)

Элемент DeleteFunction в языке спецификации сопоставления (MSL) сопоставляет функцию удаления типа сущности или ассоциации в концептуальной модели с хранимой процедурой в базовой базе данных. Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе "Элемент функции" (SSDL).

Примечание.

Если вы не сопоставляете все три операции вставки, обновления или удаления типа сущности с хранимыми процедурами, операции без сопоставления при выполнении во время выполнения и возникает исключение UpdateException.

Элемент DeleteFunction, применяемый к EntityTypeMapping

При применении к элементу EntityTypeMapping элемент DeleteFunction сопоставляет функцию удаления типа сущности в концептуальной модели с хранимой процедурой.

Элемент DeleteFunction может иметь следующие дочерние элементы при применении к элементу EntityTypeMapping :

  • AssociationEnd (ноль или больше)
  • ComplexProperty (ноль или более)
  • ScalarProperty (ноль или более)

Применимые атрибуты

В следующей таблице описываются атрибуты, которые можно применить к элементу DeleteFunction при применении к элементу EntityTypeMapping .

Имя атрибута Обязательно Значение
Имя функции Да Имя хранимой процедуры (с указанием пространства имен), с которой сопоставляется функция удаления. Хранимая процедура должна объявляться в модели хранения.
RowsAffectedParameter No Имя выходного параметра, возвращающего количество обработанных строк.

Пример

Следующий пример основан на модели School и показывает элемент DeleteFunction , сопоставляющий функцию удаления типа сущности Person с хранимой процедурой DeletePerson . Хранимая процедура DeletePerson объявлена в модели хранения.

 <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, применяемый к AssociationSetMapping

При применении к элементу AssociationSetMapping элемент DeleteFunction сопоставляет функцию удаления ассоциации в концептуальной модели с хранимой процедурой.

Элемент DeleteFunction может иметь следующие дочерние элементы при применении к элементу AssociationSetMapping :

  • EndProperty

Применимые атрибуты

В следующей таблице описываются атрибуты, которые можно применить к элементу DeleteFunction при применении к элементу AssociationSetMapping .

Имя атрибута Обязательно Значение
Имя функции Да Имя хранимой процедуры (с указанием пространства имен), с которой сопоставляется функция удаления. Хранимая процедура должна объявляться в модели хранения.
RowsAffectedParameter No Имя выходного параметра, возвращающего количество обработанных строк.

Пример

Следующий пример основан на модели School и показывает элемент DeleteFunction , используемый для сопоставления функции удаления ассоциации CourseInstructor с хранимой процедурой DeleteCourseInstructor . Хранимая процедура DeleteCourseInstructor объявлена в модели хранения.

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

Элемент EndProperty в языке спецификации сопоставления (MSL) определяет сопоставление между концом или функцией изменения ассоциации концептуальной модели и базовой базой данных. Сопоставление столбцов свойств указывается в дочернем элементе ScalarProperty.

Если элемент EndProperty используется для определения сопоставления для конца концептуальной ассоциации модели, он является дочерним элементом AssociationSetMapping. Если элемент EndProperty используется для определения сопоставления для функции изменения концептуальной ассоциации модели, это дочерний элемент элемента InsertFunction или deleteFunction.

Элемент EndProperty может иметь следующие дочерние элементы:

  • ScalarProperty (ноль или более)

Применимые атрибуты

В следующей таблице описываются атрибуты, применимые к элементу EndProperty :

Имя атрибута Обязательно Значение
Имя Да Имя сопоставляемого конца ассоциации.

Пример

В следующем примере показан элемент AssociationSetMapping , в котором сопоставление FK_Course_Department в концептуальной модели сопоставляется с таблицей Course в базе данных. Сопоставления между свойствами типа связи и столбцами таблицы указываются в дочерних элементах 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>

Пример

В следующем примере показан элемент EndProperty , сопоставляющий функции вставки и удаления ассоциации (CourseInstructor) с хранимыми процедурами в базовой базе данных. Функции, с которыми выполняется сопоставление, объявляются в модели хранения.

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

Элемент EntityContainerMapping в языке спецификации сопоставления (MSL) сопоставляет контейнер сущностей в концептуальной модели с контейнером сущностей в модели хранения. Элемент EntityContainerMapping является дочерним элементом элемента Mapping.

Элемент EntityContainerMapping может содержать следующие дочерние элементы (в указанном порядке):

  • EntitySetMapping (ноль или больше)
  • AssociationSetMapping (ноль или больше)
  • FunctionImportMapping (ноль или больше)

Применимые атрибуты

В следующей таблице описаны атрибуты, которые можно применить к элементу EntityContainerMapping .

Имя атрибута Обязательно Значение
служба хранилища ModelContainer Да Имя контейнера сущностей модели хранения, с которым выполняется сопоставление.
CdmEntityContainer Да Имя контейнера сущностей концептуальной модели, с которым выполняется сопоставление.
GenerateUpdateViews No true или false. Если значение false, представления обновлений не создаются. Этот атрибут должен иметь значение False, если у вас есть сопоставление только для чтения, которое будет недопустимым, так как данные могут не выполняться успешно.
Значение по умолчанию — true.

Пример

В следующем примере показан элемент EntityContainerMapping , который сопоставляет контейнер SchoolModelEntities (контейнер сущностей концептуальной модели) с контейнером SchoolModelStoreContainer (контейнер сущностей модели хранения):

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

Элемент EntitySetMapping в языке спецификации сопоставления (MSL) сопоставляет все типы в сущностях концептуальной модели, наборы сущностей в модели хранения. Набор сущностей в концептуальной модели — это логический контейнер для экземпляров сущностей одного типа (и производных типов). Набор сущностей в модели хранения представляет таблицу или представление в базовой базе данных. Набор сущностей концептуальной модели определяется значением атрибута Name элемента EntitySetMapping. Сопоставленное с таблицей или представлением указывается атрибутом StoreEntitySet в каждом дочернем элементе MappingFragment или в самом элементе EntitySetMapping .

Элемент EntitySetMapping может содержать следующие дочерние элементы:

  • EntityTypeMapping (ноль или больше)
  • QueryView (ноль или один)
  • СопоставлениеFragment (ноль или больше)

Применимые атрибуты

В следующей таблице описаны атрибуты, которые можно применить к элементу EntitySetMapping .

Имя атрибута Обязательно Значение
Название Да Имя сопоставляемого набора сущностей концептуальной модели.
TypeName1 No Имя сопоставляемого типа сущности концептуальной модели.
StoreEntitySet1 No Имя сопоставляемого набора сущностей модели хранения.
MakeColumnsDistinct No Значение True или False в зависимости от того, возвращаются ли только отдельные строки.
Если этот атрибут имеет значение True, атрибут GenerateUpdateViews элемента EntityContainerMapping должен иметь значение False.

 

1Атрибуты TypeName и StoreEntitySet можно использовать вместо дочерних элементов EntityTypeMapping и MappingFragment для сопоставления одного типа сущности с одной таблицей.

Пример

В следующем примере показан элемент EntitySetMapping , который сопоставляет три типа (базовый тип и два производных типа) в наборе сущностей Courses концептуальной модели с тремя разными таблицами в базовой базе данных. Таблицы задаются атрибутом StoreEntitySet в каждом элементе 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 (MSL)

Элемент EntityTypeMapping в языке спецификации сопоставления (MSL) определяет сопоставление между типом сущности в концептуальной модели и таблицах или представлениях в базовой базе данных. Сведения о типах сущностей концептуальной модели и базовых таблицах баз данных или представлениях см. в разделе EntityType Element (CSDL) и EntitySet Element (SSDL). Тип сущности концептуальной модели, сопоставленный, указывается атрибутом TypeName элемента EntityTypeMapping. Таблица или представление, сопоставленное, указывается атрибутом StoreEntitySet дочернего элемента MappingFragment.

Дочерний элемент ModificationFunctionMapping можно использовать для сопоставления функций вставки, обновления или удаления функций типов сущностей с хранимыми процедурами в базе данных.

Элемент EntityTypeMapping может содержать следующие дочерние элементы:

  • СопоставлениеFragment (ноль или больше)
  • ModificationFunctionMapping (ноль или один)
  • ScalarProperty
  • Condition

Примечание.

Элементы MappingFragment и ModificationFunctionMapping не могут быть дочерними элементами элемента EntityTypeMapping одновременно.

Примечание.

Элементы ScalarProperty и Condition могут быть дочерними элементами элемента EntityTypeMapping, если он используется в элементе FunctionImportMapping .

Применимые атрибуты

В следующей таблице описаны атрибуты, которые можно применить к элементу EntityTypeMapping .

Имя атрибута Обязательно Значение
Typename Да Имя с указанием пространства имен типа сущности концептуальной модели, с которым выполняется сопоставление.
Если тип является абстрактным или производным типом, значение должно быть равно IsOfType(Namespace-qualified_type_name).

Пример

В следующем примере показан элемент EntitySetMapping с двумя дочерними элементами EntityTypeMapping . В первом элементе EntityTypeMapping тип сущности SchoolModel.Person сопоставляется с таблицей Person. Во втором элементе EntityTypeMapping функция обновления типа SchoolModel.Person сопоставляется с хранимой процедурой UpdatePerson в базе данных.

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

Пример

В следующем примере показано сопоставление иерархии типа, в которой корневой тип является абстрактным. Обратите внимание на использование синтаксиса IsOfType для атрибутов 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 (MSL)

Элемент FunctionImportMapping в языке спецификации сопоставления (MSL) определяет сопоставление между импортом функции в концептуальной модели и хранимой процедурой или функцией в базовой базе данных. Импорт функций должен быть объявлен в концептуальной модели, а хранимые процедуры должны быть объявлены в модели хранения. Дополнительные сведения см. в разделе FunctionImport Element (CSDL) и Function Element (SSDL).

Примечание.

По умолчанию импорт функции возвращает тип сущности концептуальной модели или сложный тип. В этом случае имена столбцов, которые вернула основная хранимая процедура, должны точно соответствовать именам свойств в типе концептуальной модели. Если имена столбцов не совпадают с именами свойств, сопоставление должно быть определено в элементе ResultMapping.

Элемент FunctionImportMapping может содержать следующие дочерние элементы:

  • ResultMapping (ноль или больше)

Применимые атрибуты

В следующей таблице описаны атрибуты, применимые к элементу FunctionImportMapping :

Имя атрибута Обязательно Значение
FunctionImportName Да Имя импорта функции в концептуальной модели, с которым выполняется сопоставление.
Имя функции Да Имя импорта функции в модели хранения из полного пространства имен, с которым выполняется сопоставление.

Пример

Следующий пример основан на модели School. Рассмотрим следующую функцию в модели хранения:

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

Также рассмотрим данный импорт функции в концептуальной модели:

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

В следующем примере показан элемент FunctionImportMapping, используемый для сопоставления функции и импорта функций выше друг с другом:

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

 

Элемент InsertFunction (MSL)

Элемент InsertFunction в языке спецификации сопоставления (MSL) сопоставляет функцию вставки типа сущности или ассоциации в концептуальной модели с хранимой процедурой в базовой базе данных. Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе "Элемент функции" (SSDL).

Примечание.

Если вы не сопоставляете все три операции вставки, обновления или удаления типа сущности с хранимыми процедурами, операции без сопоставления при выполнении во время выполнения и возникает исключение UpdateException.

Элемент InsertFunction может быть дочерним элементом элемента ModificationFunctionMapping и применен к элементу EntityTypeMapping или элементу AssociationSetMapping.

Элемент InsertFunction, применяемый к EntityTypeMapping

При применении к элементу EntityTypeMapping элемент InsertFunction сопоставляет функцию вставки типа сущности в концептуальной модели с хранимой процедурой.

Элемент InsertFunction может иметь следующие дочерние элементы при применении к элементу EntityTypeMapping :

  • AssociationEnd (ноль или больше)
  • ComplexProperty (ноль или более)
  • ResultBinding (ноль или один)
  • ScalarProperty (ноль или более)

Применимые атрибуты

В следующей таблице описываются атрибуты, которые можно применить к элементу InsertFunction при применении к элементу EntityTypeMapping .

Имя атрибута Обязательно Значение
Имя функции Да Имя хранимой процедуры (с указанием пространства имен), с которой сопоставляется функция вставки. Хранимая процедура должна объявляться в модели хранения.
RowsAffectedParameter No Имя выходного параметра, возвращающего количество обработанных строк.

Пример

Следующий пример основан на модели School и показывает элемент InsertFunction , используемый для сопоставления функции вставки типа сущности Person с хранимой процедурой InsertPerson . Хранимая процедура InsertPerson объявлена в модели хранения.

 <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, применяемый к AssociationSetMapping

При применении к элементу AssociationSetMapping элемент InsertFunction сопоставляет функцию вставки ассоциации в концептуальной модели с хранимой процедурой.

Элемент InsertFunction может иметь следующие дочерние элементы при применении к элементу AssociationSetMapping :

  • EndProperty

Применимые атрибуты

В следующей таблице описаны атрибуты, которые можно применить к элементу InsertFunction при применении к элементу AssociationSetMapping .

Имя атрибута Обязательно Значение
Имя функции Да Имя хранимой процедуры (с указанием пространства имен), с которой сопоставляется функция вставки. Хранимая процедура должна объявляться в модели хранения.
RowsAffectedParameter No Имя выходного параметра, возвращающего количество обработанных строк.

Пример

Следующий пример основан на модели School и показывает элемент InsertFunction , используемый для сопоставления функции вставки ассоциации CourseInstructor с хранимой процедурой InsertCourseInstructor . Хранимая процедура InsertCourseInstructor объявлена в модели хранения.

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

Элемент сопоставления (MSL)

Элемент Сопоставления в языке спецификации сопоставления (MSL) содержит сведения о сопоставлении объектов, определенных в концептуальной модели с базой данных (как описано в модели хранения). Дополнительные сведения см. в спецификации CSDL и спецификации SSDL.

Элемент Mapping является корневым элементом для спецификации сопоставления. Пространство имен XML для спецификаций https://schemas.microsoft.com/ado/2009/11/mapping/csсопоставления.

У элемента Mapping могут быть следующие дочерние элементы (в порядке перечисления):

  • Псевдоним (ноль или больше)
  • EntityContainerMapping (ровно один)

Имена типов концептуальной модели и модели хранения, которые упоминаются в языке MSL, должны указываться вместе с именами соответствующих пространств имен. Сведения о имени пространства имен концептуальной модели см. в разделе "Элемент схемы" (CSDL). Сведения о имени пространства имен модели хранилища см. в разделе "Элемент схемы" (SSDL). Псевдонимы для пространств имен, используемых в MSL, можно определить с помощью элемента Alias.

Применимые атрибуты

В приведенной ниже таблице описаны атрибуты, которые можно применить к элементу Mapping .

Имя атрибута Обязательно Значение
Space Да C-S. Это фиксированное значение, и его невозможно изменить.

Пример

В следующем примере показан элемент Mapping, основанный на части модели School. Дополнительные сведения о модели school см. в кратком руководстве (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 (MSL)

Элемент MappingFragment в языке спецификации сопоставления (MSL) определяет сопоставление между свойствами типа сущности концептуальной модели и таблицей или представлением в базе данных. Сведения о типах сущностей концептуальной модели и базовых таблицах баз данных или представлениях см. в разделе EntityType Element (CSDL) и EntitySet Element (SSDL). СопоставлениеFragment может быть дочерним элементом элемента EntityTypeMapping или элементом EntitySetMapping.

Элемент MappingFragment может иметь следующие дочерние элементы:

  • ComplexType (ноль или больше)
  • ScalarProperty (ноль или более)
  • Условие (ноль или больше)

Применимые атрибуты

В следующей таблице описываются атрибуты, которые можно применить к элементу MappingFragment .

Имя атрибута Обязательно Значение
StoreEntitySet Да Имя столбца таблицы или представления, с которым производится сопоставление.
MakeColumnsDistinct No Значение True или False в зависимости от того, возвращаются ли только отдельные строки.
Если этот атрибут имеет значение True, атрибут GenerateUpdateViews элемента EntityContainerMapping должен иметь значение False.

Пример

В следующем примере показан элемент MappingFragment в качестве дочернего элемента EntityTypeMapping . В этом примере свойства типа Course в концептуальной модели сопоставляются со столбцами таблицы Course в базе данных.

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

Пример

В следующем примере показан элемент MappingFragment в качестве дочернего элемента EntitySetMapping . Как и в приведенном выше примере, свойства типа Course в концептуальной модели сопоставляются со столбцами таблицы Course в базе данных.

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

Элемент ModificationFunctionMapping в языке спецификации сопоставления (MSL) сопоставляет функции вставки, обновления и удаления типов сущностей концептуальной модели с хранимыми процедурами в базовой базе данных. Элемент ModificationFunctionMapping также может сопоставить функции вставки и удаления для связей "многие ко многим" в концептуальной модели с хранимыми процедурами в базовой базе данных. Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе "Элемент функции" (SSDL).

Примечание.

Если вы не сопоставляете все три операции вставки, обновления или удаления типа сущности с хранимыми процедурами, операции без сопоставления при выполнении во время выполнения и возникает исключение UpdateException.

Примечание.

Если функции преобразования для одной сущности в иерархии наследования сопоставляются с хранимыми процедурами, то функции преобразования всех типов в иерархии должны быть сопоставлены с хранимыми процедурами.

Элемент ModificationFunctionMapping может быть дочерним элементом элемента EntityTypeMapping или элементом AssociationSetMapping.

Элемент ModificationFunctionMapping может иметь следующие дочерние элементы:

  • DeleteFunction (ноль или один)
  • InsertFunction (ноль или один)
  • UpdateFunction (ноль или один)

Атрибуты не применимы к элементу ModificationFunctionMapping .

Пример

В следующем примере показано сопоставление набора сущностей для набора сущностей Люди в модели School. Помимо сопоставления столбцов для типа сущности Person отображаются сопоставления функций вставки, обновления и удаления типа Person . Функции, с которыми выполняется сопоставление, объявляются в модели хранения.

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

Пример

В следующем примере показано сопоставление набора сопоставлений для сопоставления CourseInstructor , заданного в модели School. Помимо сопоставления столбцов для ассоциации CourseInstructor отображаются сопоставления функций вставки и удаления ассоциации CourseInstructor . Функции, с которыми выполняется сопоставление, объявляются в модели хранения.

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

Элемент QueryView в языке спецификации сопоставления (MSL) определяет сопоставление только для чтения между типом сущности или связью в концептуальной модели и таблицей в базовой базе данных. Сопоставление определяется с помощью запроса Entity SQL, вычисляемого в модели хранения, и вы выражаете результирующий набор с точки зрения сущности или связи в концептуальной модели. Представления запросов доступны только для чтения, поэтому для обновления типов, которые определены представлениями запросов, не могут применяться стандартные команды обновления. Представления запросов доступны только для чтения, поэтому для обновления типов, которые определены представлениями запросов, не могут применяться стандартные команды обновления. Дополнительные сведения см. в разделе "Практическое руководство. Сопоставление функций изменения с хранимыми процедурами".

Примечание.

В элементе QueryView выражения Entity SQL, содержащие groupBy, агрегаты групп или свойства навигации, не поддерживаются.

 

Элемент QueryView может быть дочерним элементом EntitySetMapping или элементом AssociationSetMapping. В первом случае представление запроса определяет сопоставление только для чтения для сущности в концептуальной модели. Во втором случае представление запроса определяет сопоставление только для чтения для связи в концептуальной модели.

Примечание.

Если элемент AssociationSetMapping предназначен для связи с ограничением ссылки, элемент AssociationSetMapping игнорируется. Дополнительные сведения см. в разделе "Элемент ReferentialConstraint" (CSDL).

Элемент QueryView не может содержать дочерние элементы.

Применимые атрибуты

В следующей таблице описаны атрибуты, которые можно применить к элементу QueryView .

Имя атрибута Обязательно Значение
Typename No Имя типа концептуальной модели, сопоставляемой представлением запроса.

Пример

В следующем примере показан элемент QueryView в качестве дочернего элемента EntitySetMapping и определяет сопоставление представлений запросов для типа сущности Department в учебной модели.

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

Так как запрос возвращает только подмножество членов типа Отдела в модели хранения, тип Отдела в модели учебного заведения был изменен на основе этого сопоставления следующим образом:

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

Пример

В следующем примере элемент QueryView отображается в качестве дочернего элемента AssociationSetMapping и определяет сопоставление только для чтения для FK_Course_Department связи в модели 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>

 

Комментарии

Представления запросов можно определять для реализации следующих сценариев.

  • Определение сущности в концептуальной модели, не включающей все свойства сущности в модели хранения. Сюда входят свойства, которые не имеют значений по умолчанию и не поддерживают значения NULL .
  • Сопоставление вычисляемых столбцов в модели хранения со свойствами типов сущностей в концептуальной модели.
  • Определение сопоставления, в котором условия, используемые для секционирования сущностей в концептуальной модели, не базируются на равенстве. При указании условного сопоставления с помощью элемента Condition указанное условие должно быть равно указанному значению. Дополнительные сведения см. в разделе Condition Element (MSL).
  • Сопоставление одного столбца в модели хранения с несколькими типами в концептуальной модели.
  • Сопоставление нескольких типов с одной и той же таблицей.
  • Определение ассоциаций в концептуальной модели, базирующихся на внешних ключах реляционной схемы.
  • Применение пользовательской бизнес-логики для задания значений свойств в концептуальной модели. Например, можно сопоставить строковое значение "T" в источнике данных со значением true, логическим значением в концептуальной модели.
  • Определение условных фильтров для результатов запроса.
  • Наложение меньшего числа ограничений на данные в концептуальной модели, нежели в модели хранения. Например, можно сделать свойство в концептуальной модели null, даже если столбец, с которым он сопоставлен, не поддерживает значения NULL.

При определении представлений запросов для сущностей необходимо принимать во внимание следующие соображения.

  • Представления запросов доступны только для чтения. Обновление сущностей можно осуществлять только с помощью функций изменения.
  • В случае определения типа сущности через представление запроса необходимо также определять все связанные сущности через представления запросов.
  • При сопоставлении связи "многие ко многим" сущности в модели хранения, представляющей таблицу ссылок в реляционной схеме, необходимо определить элемент QueryView в элементе AssociationSetMapping для этой таблицы ссылок.
  • Представления запросов должны быть определены для всех типов в иерархии типов. Это можно выполнить следующими способами:
    • С одним элементом QueryView, который задает один запрос Entity SQL, который возвращает объединение всех типов сущностей в иерархии.
    • С одним элементом QueryView, который задает один запрос Entity SQL, который использует оператор CASE для возврата определенного типа сущности в иерархии на основе определенного условия.
    • С дополнительным элементом QueryView для определенного типа в иерархии. В этом случае используйте атрибут TypeName элемента QueryView, чтобы указать тип сущности для каждого представления.
  • Если представление запроса определено, нельзя указать атрибут служба хранилища SetName в элементе EntitySetMapping.
  • При определении представления запроса элемент EntitySetMappingтакже не может содержать сопоставления свойств .

Элемент ResultBinding (язык MSL)

Элемент ResultBinding в языке спецификации сопоставления (MSL) сопоставляет значения столбцов, возвращаемые хранимыми процедурами свойствам сущности в концептуальной модели, когда функции изменения типа сущности сопоставляются с хранимыми процедурами в базовой базе данных. Например, если значение столбца удостоверений возвращается хранимой процедурой вставки, элемент ResultBinding сопоставляет возвращаемое значение свойству типа сущности в концептуальной модели.

Элемент ResultBinding может быть дочерним элементом InsertFunction или элементом UpdateFunction.

Элемент ResultBinding не может содержать дочерние элементы.

Применимые атрибуты

В следующей таблице описываются атрибуты, применимые к элементу ResultBinding :

Имя атрибута Обязательно Значение
Название Да Имя свойства сущности в концептуальной модели, с которым выполняется сопоставление.
ColumnName Да Имя столбца, с которым выполнятся сопоставление.

Пример

Следующий пример основан на модели School и показывает элемент InsertFunction , используемый для сопоставления функции вставки типа сущности Person с хранимой процедурой InsertPerson . (The Хранимая процедура InsertPerson показана ниже и объявлена в модели хранения.) Элемент ResultBinding используется для сопоставления значения столбца, возвращаемого хранимой процедурой (NewPersonID) с свойством типа сущности (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>

В следующем примере Transact-SQL описывается хранимая процедура 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 (язык MSL)

Элемент ResultMapping в языке спецификации сопоставления (MSL) определяет сопоставление между импортом функций в концептуальной модели и хранимой процедурой в базовой базе данных, если указано следующее:

  • Импорт функции возвращает тип сущности концептуальной модели или сложный тип.
  • Имена столбцов, возвращаемые хранимой процедурой, не совпадают в точности с именами свойств в сложном типе или типе сущности.

По умолчанию сопоставление между столбцами, возвращаемыми хранимой процедурой, и сложным типом или типом сущности выполняется по именам столбцов и свойств. Если имена столбцов не совпадают с именами свойств, необходимо использовать элемент ResultMapping для определения сопоставления. Пример сопоставления по умолчанию см. в разделе FunctionImportMapping Element (MSL).

Элемент ResultMapping является дочерним элементом элемента FunctionImportMapping.

Элемент ResultMapping может иметь следующие дочерние элементы:

  • EntityTypeMapping (ноль или больше)
  • ComplexTypeMapping

Атрибуты не применимы к элементу ResultMapping .

Пример

Рассмотрим следующую хранимую процедуру:

 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

Рассмотрим следующий тип сущности концептуальной модели:

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

Чтобы создать импорт функции, возвращающий экземпляры предыдущего типа сущности, сопоставление между столбцами, возвращаемыми хранимой процедурой и типом сущности, необходимо определить в элементе 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 (MSL)

Элемент ScalarProperty в языке спецификации сопоставления (MSL) сопоставляет свойство типа сущности концептуальной модели, сложного типа или сопоставления с столбцом таблицы или параметром хранимой процедуры в базовой базе данных.

Примечание.

Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе "Элемент функции" (SSDL).

Элемент ScalarProperty может быть дочерним элементом следующих элементов:

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

В качестве дочернего элемента MappingFragment, ComplexProperty или EndProperty элемент ScalarProperty сопоставляет свойство в концептуальной модели с столбцом в базе данных. Как дочерний элемент InsertFunction, UpdateFunction или DeleteFunction элемент ScalarProperty сопоставляет свойство в концептуальной модели с параметром хранимой процедуры.

Элемент ScalarProperty не может содержать дочерние элементы.

Применимые атрибуты

Атрибуты, применяемые к элементу ScalarProperty , отличаются в зависимости от роли элемента.

В следующей таблице описываются атрибуты, применимые при использовании элемента ScalarProperty для сопоставления свойства концептуальной модели со столбцом в базе данных:

Имя атрибута Обязательно Значение
Название Да Имя свойства концептуальной модели, с которым выполняется сопоставление.
ColumnName Да Имя столбца таблицы, с которым производится сопоставление.

В следующей таблице описываются атрибуты, применимые к элементу ScalarProperty при сопоставлении свойства концептуальной модели с параметром хранимой процедуры:

Имя атрибута Обязательно Значение
Название Да Имя свойства концептуальной модели, с которым выполняется сопоставление.
Имя_параметра Да Имя сопоставляемого параметра.
Версия No Current или Original в зависимости от того, следует ли использовать текущее значение или исходное значение свойства для проверка параллелизма.

Пример

В следующем примере показан элемент ScalarProperty , используемый двумя способами:

  • Чтобы сопоставить свойства типа сущности Person со столбцами таблицы Person.
  • Чтобы сопоставить свойства типа сущности Person с параметрами хранимой процедуры UpdatePerson . Хранимые процедуры объявляются в модели хранения.
 <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>

Пример

В следующем примере показан элемент ScalarProperty , используемый для сопоставления функций вставки и удаления концептуальной модели с хранимыми процедурами в базе данных. Хранимые процедуры объявляются в модели хранения.

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

Элемент UpdateFunction в языке спецификации сопоставления (MSL) сопоставляет функцию обновления типа сущности в концептуальной модели с хранимой процедурой в базовой базе данных. Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе "Элемент функции" (SSDL).

Примечание.

Если вы не сопоставляете все три операции вставки, обновления или удаления типа сущности с хранимыми процедурами, операции без сопоставления при выполнении во время выполнения и возникает исключение UpdateException.

Элемент UpdateFunction может быть дочерним элементом элемента ModificationFunctionMapping и применен к элементу EntityTypeMapping.

Элемент UpdateFunction может иметь следующие дочерние элементы:

  • AssociationEnd (ноль или больше)
  • ComplexProperty (ноль или более)
  • ResultBinding (ноль или один)
  • ScalarProperty (ноль или более)

Применимые атрибуты

В следующей таблице описаны атрибуты, которые можно применить к элементу UpdateFunction .

Имя атрибута Обязательно Значение
Имя функции Да Имя хранимой процедуры (с указанием пространства имен), с которой сопоставляется функция обновления. Хранимая процедура должна объявляться в модели хранения.
RowsAffectedParameter No Имя выходного параметра, возвращающего количество обработанных строк.

Пример

Следующий пример основан на модели School и показывает элемент UpdateFunction , используемый для сопоставления функции обновления типа сущности Person с хранимой процедурой UpdatePerson . Хранимая процедура UpdatePerson объявлена в модели хранения.

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