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

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

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

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

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

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

Версия MSL Пространство имен XML
MSL v1 urn: schemas-microsoft-com: Windows: хранилище: сопоставление: CS
MSL v2 https://schemas.microsoft.com/ado/2008/09/mapping/cs
MSL v3 https://schemas.microsoft.com/ado/2009/11/mapping/cs

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

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

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

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

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

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

Пример

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

 <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 используется, когда функции изменения типа сущности в концептуальной модели сопоставляются с хранимыми процедурами в базовой базе данных. Если хранимая процедура изменения принимает параметр, значение которого хранится в свойстве Association, элемент AssociationEnd сопоставляет значение свойства с параметром. Дополнительные сведения см. в приведенных ниже примерах.

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

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

  • ScalarProperty

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

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

Имя атрибута Обязательный Значение
AssociationSet Да Имя сопоставляемой ассоциации.
От Да Значение атрибута 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 сущности с этой хранимой процедурой, необходимо указать значение для параметра Course . Значение для 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 , используемый для сопоставления свойства DepartmentIDFK_Course_Department ассоциации с хранимой процедурой упдатекаурсе (для которой сопоставлена функция Update типа сущности 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 (ноль или два)
  • Condition (ноль и более)
  • ModificationFunctionMapping (ноль или один)

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

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

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

Пример

В следующем примере показан элемент 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)

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

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

  • ScalarProperty (ноль и более)
  • Комплекспроперти (ноль или более)
  • Комплекстипемаппинг (ноль или более)
  • Condition (ноль и более)

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

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

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

Пример

Следующий пример основан на модели 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 заменены одним сложным свойством, именем:

 <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 показан элемент комплекспроперти , используемый для отображения свойства 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)

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

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

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

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

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

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

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

Имя атрибута Обязательный Значение
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>

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

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

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

Примечание

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

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

  • AssociationSetMapping
  • ComplexProperty
  • EntitySetMapping
  • MappingFragment
  • EntityTypeMapping

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

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

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

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

Пример

В следующем примере элементы Condition показаны как дочерние элементы элементов MappingFragment . Если параметр HireDate не равен null и енроллментдате имеет значение null, данные сопоставляются между типом счулмодел. Instructor и столбцами PersonID и HireDate таблицы Person . Если енроллментдате имеет значение NOT NULL, а значение HireDate равно null, то данные сопоставляются между типом счулмодел. 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 сопоставляет функцию Delete типа сущности или ассоциации в концептуальной модели с хранимой процедурой в базовой базе данных. Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе элемент Function (SSDL).

Примечание

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

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

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

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

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

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

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

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

Пример

Следующий пример основан на модели School и показывает элемент DeleteFunction , сопоставленный функции Delete типа сущности 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>

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

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

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

  • EndProperty

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

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

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

Пример

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

 <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 определяет сопоставление между функцией End или модификации ассоциации концептуальной модели и базовой базы данных. Сопоставление столбца свойств указано в дочернем элементе 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 , сопоставленный с функциями INSERT и DELETE ассоциации (каурсеинструктор) с хранимыми процедурами в базовой базе данных. Функции, с которыми выполняется сопоставление, объявляются в модели хранения.

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

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

Пример

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

 <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 . Сопоставленная таблица или представление задаются атрибутом сторинтитисет в каждом дочернем элементе MappingFragment или в самом элементе EntitySetMapping .

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

  • EntityTypeMapping (ноль и более)
  • QueryView (ноль или один)
  • MappingFragment (ноль и более)

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

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

Имя атрибута Обязательный Значение
Имя Да Имя сопоставляемого набора сущностей концептуальной модели.
Имя типа1 Нет Имя сопоставляемого типа сущности концептуальной модели.
Сторинтитисет1 Нет Имя сопоставляемого набора сущностей модели хранения.
Атрибутом makecolumnsdistinct Нет Значение true или false в зависимости от того, возвращаются ли только отдельные строки.
Если для этого атрибута задано значение true, атрибуту женератеупдатевиевс элемента EntityContainerMapping должно быть присвоено значение false.

 

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

Пример

В следующем примере показан элемент EntitySetMapping , сопоставляющий три типа (базовый тип и два производных типа) в наборе сущностей Courses концептуальной модели с тремя различными таблицами в основной базе данных. Таблицы задаются атрибутом сторинтитисет в каждом элементе 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 (язык CSDL) и Элемент EntitySet (язык SSDL). Сопоставляемый тип сущности концептуальной модели задается атрибутом TypeName элемента EntityTypeMapping . Сопоставляемая таблица или представление задается атрибутом сторинтитисет дочернего элемента MappingFragment.

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

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

  • MappingFragment (ноль и более)
  • ModificationFunctionMapping (ноль или один)
  • ScalarProperty
  • Условие

Примечание

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

Примечание

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

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

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

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

Пример

В следующем примере показан элемент EntitySetMapping с двумя дочерними элементами EntityTypeMapping . В первом элементе EntityTypeMapping тип сущности счулмодел. Person сопоставляется с таблицей Person . Во втором элементе EntityTypeMapping функция обновления типа счулмодел. 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>
       <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 синтаксиса для атрибутов IsOfType .

 <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 (CSDL) и элемент Function (SSDL).

Примечание

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

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

  • Ресултмаппинг (ноль или более)

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

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

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

Пример

Следующий пример основан на модели 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 сопоставляет функцию INSERT типа сущности или ассоциацию в концептуальной модели с хранимой процедурой в базовой базе данных. Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе элемент Function (SSDL).

Примечание

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

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

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

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

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

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

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

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

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

Пример

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

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

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

Пример

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

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

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

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

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

  • Alias (ноль и более элементов)
  • EntityContainerMapping (ровно один)

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

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

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

Имя атрибута Обязательный Значение
Модуль Да 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 (язык CSDL) и Элемент EntitySet (язык SSDL). MappingFragment может быть дочерним элементом элемента EntityTypeMapping или элемента EntitySetMapping.

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

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

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

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

Имя атрибута Обязательный Значение
сторинтитисет Да Имя столбца таблицы или представления, с которым производится сопоставление.
Атрибутом makecolumnsdistinct Нет Значение true или false в зависимости от того, возвращаются ли только отдельные строки.
Если для этого атрибута задано значение true, атрибуту женератеупдатевиевс элемента EntityContainerMapping должно быть присвоено значение false.

Пример

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

 <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 также может сопоставлять функции INSERT и DELETE для ассоциаций "многие ко многим" в концептуальной модели с хранимыми процедурами в базовой базе данных. Хранимые процедуры, с которыми сопоставляются функции изменения, должны объявляться в модели хранения. Дополнительные сведения см. в разделе элемент Function (SSDL).

Примечание

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

Примечание

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

Элемент 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>

Пример

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

 <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 Нет Имя типа концептуальной модели, сопоставляемой представлением запроса.

Пример

В следующем примере показано, как элемент QueryView является дочерним элементом элемента EntitySetMapping и определяет сопоставление представления запроса для типа сущности « Отдел » в модели School.

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

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

 <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 и определяется сопоставление только для чтения для ассоциации в модели 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 (MSL).
  • Сопоставление одного столбца в модели хранения с несколькими типами в концептуальной модели.
  • Сопоставление нескольких типов с одной и той же таблицей.
  • Определение ассоциаций в концептуальной модели, базирующихся на внешних ключах реляционной схемы.
  • Применение пользовательской бизнес-логики для задания значений свойств в концептуальной модели. Например, строковое значение «T» в источнике данных можно преобразовать в значение « true» (логическое) в концептуальной модели.
  • Определение условных фильтров для результатов запроса.
  • Наложение меньшего числа ограничений на данные в концептуальной модели, нежели в модели хранения. Например, можно сделать свойство в концептуальной модели обнуляемым, даже если столбец, с которым он сопоставлен, не поддерживает значения null.

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

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

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

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

Элемент ResultBinding может быть дочерним по отношению к элементу InsertFunction или элементу упдатефунктион.

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

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

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

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

Пример

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

 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)

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

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

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

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

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

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

К элементу ресултмаппинг не применяются атрибуты.

Пример

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

 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>

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

Пример

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

  • Для отображения свойств типа сущности Person в столбцах таблицы 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>

Пример

В следующем примере показан элемент 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)

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

Примечание

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

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

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

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

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

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

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

Пример

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

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