CSDL 规范

概念架构定义语言 (CSDL) 是一种基于 XML 的语言,它描述构成数据驱动应用程序的概念模型的实体、关系和函数。 此概念模型可以由实体框架或 WCF Data Services 使用。 实体框架使用通过 CSDL 描述的元数据将在概念模型中定义的实体和关系映射到数据源。 有关详细信息,请参阅 SSDL 规范MSL 规范

CSDL 是实体框架对实体数据模型的实现。

在实体框架应用程序中,概念模型元数据从 .csdl 文件(以 CSDL 编写)加载到 System.Data.Metadata.Edm.EdmItemCollection 的实例中,并且可以通过 System.Data.Metadata.Edm.MetadataWorkspace 类中的方法进行访问。 实体框架使用概念模型元数据将针对概念模型的查询转换为数据源特定的命令。

EF 设计器在设计时将概念模型信息存储在 .edmx 文件中。 在生成时,EF 设计器使用 .edmx 文件中的信息创建在运行时实体框架需要的 .csdl 文件。

CSDL 的版本按 XML 命名空间进行区分。

CSDL 版本 XML 命名空间
CSDL v1 https://schemas.microsoft.com/ado/2006/04/edm
CSDL v2 https://schemas.microsoft.com/ado/2008/09/edm
CSDL v3 https://schemas.microsoft.com/ado/2009/11/edm

 

Association 元素 (CSDL)

Association 元素定义两个实体类型之间的关系。 关联必须指定关系中涉及的实体类型和关系的每一端可能的实体类型数量(也称为重数)。 关联端的重数的值可以为一 (1)、零或一 (0..1) 或多 (*)。 此信息在两个子 End 元素中指定。

通过导航属性或外键(如果在实体类型上公开了外键)可以访问关联一端的实体类型实例。

在应用程序中,关联的实例表示实体类型的实例之间的特定关联。 关联实例按逻辑分组在关联集中。

Association 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • End(正好两个元素)
  • ReferentialConstraint(零个或多个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 Association 元素的特性。

属性名称 为必填
Name 关联的名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Association 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个 Association 元素,当外键尚未在 CustomerOrder 实体类型上公开时,该元素定义 CustomerOrders 关联。 关联的每个 EndMultiplicity 值指示多个 Orders 可以与 Customer 关联,但只有一个 Customer 可以与 Order 关联。 此外,OnDelete 元素指示:如果删除 Customer,将删除与特定 Customer 相关且已加载到 ObjectContext 中的所有 Orders

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" >
         <OnDelete Action="Cascade" />
   </End>
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
 </Association>

 

以下示例显示一个 Association 元素,当外键已在 CustomerOrder 实体类型上公开时,该元素定义 CustomerOrders 关联。 当公开外键后,实体之间的关系通过 ReferentialConstraint 元素进行管理。 将此关联映射到数据源并不需要 AssociationSetMapping 元素。

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" >
         <OnDelete Action="Cascade" />
   </End>
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
   <ReferentialConstraint>
        <Principal Role="Customer">
            <PropertyRef Name="Id" />
        </Principal>
        <Dependent Role="Order">
             <PropertyRef Name="CustomerId" />
         </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

AssociationSet 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 AssociationSet 元素是用于相同类型的关联实例的逻辑容器。 关联集为对关联实例进行分组提供了定义,以便能够将它们映射到数据源。  

AssociationSet 元素可以具有以下子元素(按所列顺序):

  • Documentation(允许零个或一个元素)
  • End(需要正好两个元素)
  • Annotation 元素(允许零个或多个元素)

Association 特性指定关联集包含的关联的类型。 应使用正好两个 End 子元素指定构成关联集两端的实体集。

适用的属性

下表介绍可应用于 AssociationSet 元素的特性。

属性名称 为必填
Name 实体集的名称。 Name 特性的值不能与 Association 特性的值相同。
关联 关联集包含其实例的关联的完全限定名称。 关联必须与关联集位于同一个命名空间中。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 AssociationSet 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个具有两个 AssociationSet 元素的 EntityContainer 元素:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

CollectionType 元素 (CSDL)

概念架构定义语言 (CSDL) 中的 CollectionType 元素指定函数参数或函数返回类型是一个集合。 CollectionType 元素可以是 Parameter 元素或 ReturnType (Function) 元素的子元素。 可以使用 Type 特性或以下子元素之一指定集合的类型:

  • CollectionType
  • ReferenceType
  • RowType
  • TypeRef

注意

如果同时使用 Type 特性和子元素指定集合的类型,则不会对模型进行验证。

 

适用的属性

下表介绍可应用于 CollectionType 元素的特性。 注意:DefaultValueMaxLengthFixedLengthPrecisionScaleUnicodeCollation 特性只适用于 EDMSimpleTypes 的集合。

属性名称 为必填
类型 集合的类型。
可以为 Null True(默认值)或 False,取决于属性是否可以具有 null 值。
[!NOTE]
> 在 CSDL v1 中,复杂类型属性必须具有 Nullable="False"
DefaultValue 属性的默认值。
MaxLength 属性值的最大长度。
FixedLength TrueFalse,具体取决于属性值是否将作为固定长度字符串存储。
精度 属性值的精度。
缩放 属性值的刻度。
SRID 空间系统引用标识符。 仅对空间类型的属性有效。   有关详细信息,请参阅 SRIDSRID (SQL Server)
Unicode TrueFalse,具体取决于属性值是否将作为 Unicode 字符串存储。
Collation 指定要在数据源中使用的排序的字符串。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 CollectionType 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个模型定义函数,它使用 CollectionType 元素来指定函数返回 Person 实体类型的集合(使用 ElementType 特性指定)。

 <Function Name="LastNamesAfter">
        <Parameter Name="someString" Type="Edm.String"/>
        <ReturnType>
             <CollectionType  ElementType="SchoolModel.Person"/>
        </ReturnType>
        <DefiningExpression>
             SELECT VALUE p
             FROM SchoolEntities.People AS p
             WHERE p.LastName >= someString
        </DefiningExpression>
 </Function>

 

以下示例显示一个模型定义函数,它使用 CollectionType 元素来指定函数返回一个行集合(如在 RowType 元素中指定的一样)。

 <Function Name="LastNamesAfter">
   <Parameter Name="someString" Type="Edm.String" />
   <ReturnType>
    <CollectionType>
      <RowType>
        <Property Name="FirstName" Type="Edm.String" Nullable="false" />
        <Property Name="LastName" Type="Edm.String" Nullable="false" />
      </RowType>
    </CollectionType>
   </ReturnType>
   <DefiningExpression>
             SELECT VALUE ROW(p.FirstName, p.LastName)
             FROM SchoolEntities.People AS p
             WHERE p.LastName &gt;= somestring
   </DefiningExpression>
 </Function>

 

以下示例显示一个模型定义函数,它使用 CollectionType 元素来指定函数接受一个 Department 实体类型的集合作为参数。

 <Function Name="GetAvgBudget">
      <Parameter Name="Departments">
          <CollectionType>
             <TypeRef Type="SchoolModel.Department"/>
          </CollectionType>
           </Parameter>
       <ReturnType Type="Collection(Edm.Decimal)"/>
       <DefiningExpression>
             SELECT VALUE AVG(d.Budget) FROM Departments AS d
       </DefiningExpression>
 </Function>

 

 

ComplexType 元素 (CSDL)

ComplexType 元素定义由 EdmSimpleType 属性或其他复杂类型组成的数据结构。  复杂类型可以是实体类型的属性或其他复杂类型的属性。 复杂类型类似于复杂类型定义数据中的实体类型。 但是,在复杂类型与实体类型之间仍存在着一些重要区别:

  • 复杂类型没有标识(或键),因此不能独立存在。 复杂类型只能作为实体类型或其他复杂类型的属性而存在。
  • 复杂类型不能参与关联。 关联的任一端都不能是复杂类型,因此不能为复杂类型定义导航属性。
  • 复杂类型属性不能具有 null 值,但可以将复杂类型的每个标量属性设置为 null。

ComplexType 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • Property(零个或多个元素)
  • 批注元素(零个或多个元素)

下表介绍可应用于 ComplexType 元素的特性。

属性名称 为必填
名称 复杂类型的名称。 复杂类型的名称不能与模型作用域中的其他复杂类型、实体类型或关联的名称相同。
BaseType 作为所定义的复杂类型的基类型的另一个复杂类型的名称。
[!NOTE]
> 此属性不适用于 CSDL v1。 在该版本中不支持复杂类型的继承。
摘要 TrueFalse(默认值),具体取决于复杂类型是否为抽象类型。
[!NOTE]
> 此属性不适用于 CSDL v1。 该版本中的复杂类型不能是抽象类型。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 ComplexType 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

下面的代码示例显示一个复杂类型 Address 以及 EdmSimpleType 属性 StreetAddressCityStateOrProvinceCountryPostalCode

 <ComplexType Name="Address" >
   <Property Type="String" Name="StreetAddress" Nullable="false" />
   <Property Type="String" Name="City" Nullable="false" />
   <Property Type="String" Name="StateOrProvince" Nullable="false" />
   <Property Type="String" Name="Country" Nullable="false" />
   <Property Type="String" Name="PostalCode" Nullable="false" />
 </ComplexType>

 

要将复杂类型 Address(如上所示)定义为某个实体类型的属性,必须在实体类型定义中声明该属性类型。 以下示例将 Address 属性显示为实体类型 (Publisher) 的复杂类型:

 <EntityType Name="Publisher">
       <Key>
         <PropertyRef Name="Id" />
       </Key>
       <Property Type="Int32" Name="Id" Nullable="false" />
       <Property Type="String" Name="Name" Nullable="false" />
       <Property Type="BooksModel.Address" Name="Address" Nullable="false" />
       <NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
                           FromRole="Publisher" ToRole="Book" />
     </EntityType>

 

 

DefiningExpression 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 DefiningExpression 元素包含一个用于在概念模型中定义函数的实体 SQL表达式。  

注意

为了进行验证,DefiningExpression 元素可以包含任意内容。 但是,如果 DefiningExpression 元素不包含有效的实体 SQL,实体框架将在运行时引发异常。

 

适用的属性

可以将任意数量的批注特性(自定义 XML 特性)应用于 DefiningExpression 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

示例

以下示例使用 DefiningExpression 元素定义用于返回某书籍已出版年数的函数。 DefiningExpression 元素的内容是用实体 SQL 编写的。

 <Function Name="GetYearsInPrint" ReturnType="Edm.Int32" >
       <Parameter Name="book" Type="BooksModel.Book" />
       <DefiningExpression>
         Year(CurrentDateTime()) - Year(cast(book.PublishedDate as DateTime))
       </DefiningExpression>
     </Function>

 

 

Dependent 元素 (CSDL)

概念架构定义语言 (CSDL) 中的 Dependent 元素是 ReferentialConstraint 元素的子元素,用于定义引用约束的依赖端。 ReferentialConstraint 元素定义的功能与关系数据库中的引用完整性约束类似。 与数据库表中的一个(或多个)列可以引用另一个表的主键相同,实体类型的一个(或多个)属性可以引用另一个实体类型的实体键。 所引用的实体类型称为约束的主体端。 引用主体端的实体类型称为约束的依赖端。 PropertyRef 元素用于指定哪些键引用主体端。

Dependent 元素可以具有以下子元素(按所列顺序)

  • PropertyRef(一个或多个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 Dependent 元素的特性。

属性名称 为必填
角色 关联的依赖端的实体类型的名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Dependent 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示用作 PublishedBy 关联定义的一部分的 ReferentialConstraint 元素。 Book 实体类型的 PublisherId 属性构成引用约束的依赖端。

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

Documentation 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 Documentation 元素可用于提供有关在父元素中定义的对象的信息。 在 .edmx 文件中,当 Documentation 元素为在 EF 设计器的设计图面上显示为对象(如实体、关联或属性)的元素的子元素时,Documentation 元素的内容将显示在该对象的 Visual Studio 的“属性”窗口中。

Documentation 元素可以具有以下子元素(按所列顺序):

  • Summary:有关父元素的简短说明。 (零个或一个元素)
  • LongDescription:有关父元素的详细说明。 (零个或一个元素)
  • 批注元素。 (零个或多个元素)

适用的属性

可以将任意数量的批注特性(自定义 XML 特性)应用于 Documentation 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

示例

以下示例显示 Documentation 元素,它用作 EntityType 元素的子元素。 如果下面的代码片段在 .edmx 文件的 CSDL 内容中,则当你单击 Customer 实体类型时,Summary 和 LongDescription 元素的内容将显示在 Visual Studio 的“属性”窗口中。

 <EntityType Name="Customer">
    <Documentation>
      <Summary>Summary here.</Summary>
      <LongDescription>Long description here.</LongDescription>
    </Documentation>
    <Key>
      <PropertyRef Name="CustomerId" />
    </Key>
    <Property Type="Int32" Name="CustomerId" Nullable="false" />
    <Property Type="String" Name="Name" Nullable="false" />
 </EntityType>

 

 

End 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 End 元素可以是 Association 元素或 AssociationSet 元素的子元素。 在每一种情况下,End 元素的角色不同,适用的特性也不同。

End 元素作为 Association 元素的子元素

End 元素(作为 Association 元素的子元素)标识关联一端的实体类型以及关联的该端上可以存在的实体类型实例数量。 关联端定义为关联的一部分;关联必须正好有两个关联端。 通过导航属性或外键(如果在实体类型上公开了外键)可以访问关联一端的实体类型实例。  

End 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • OnDelete(零个或一个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 End 元素(如果该元素是 Association 元素的子元素)的特性

属性名称 为必填
类型 关联一端的实体类型的名称。
角色 关联端的名称。 如果不提供名称,将使用关联端的实体类型的名称。
多重性 10..1*,具体取决于关联端可以存在的实体类型实例的数量。
1,表明在关联端就存在一个实体类型实例。
0..1,表明在关联端存在零个或一个实体类型实例。
*,表明在关联端存在零个、一个或多个实体类型实例。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 End 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示用于定义 CustomerOrders 关联的 Association 元素。 关联的每个 EndMultiplicity 值指示多个 Orders 可以与 Customer 关联,但只有一个 Customer 可以与 Order 关联。 此外,OnDelete 元素指示:如果删除 Customer,将删除与特定 Customer 相关且已加载到 ObjectContext 中的所有 Orders

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" />
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*">
         <OnDelete Action="Cascade" />
   </End>
 </Association>

 

End 元素作为 AssociationSet 元素的子元素

End 元素指定关联集的一端。 AssociationSet 元素必须包含两个 End 元素。 End 元素中包含的信息用于将关联集映射到数据源。

End 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • 批注元素(零个或多个元素)

注意

Annotation 元素必须出现在所有其他子元素之后。 只允许在 CSDL v2 及更高版本中使用 Annotation 元素。

 

适用的属性

下表介绍可应用于 End 元素(如果该元素是 AssociationSet 元素的子元素)的特性

属性名称 为必填
EntitySet EntitySet 元素的名称,该元素用于定义父 AssociationSet 元素的一端。 EntitySet 元素必须与父 AssociationSet 元素在同一实体容器中定义。
角色 关联集端的名称。 如果不使用 Role 特性,关联集端的名称将为实体集的名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 End 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示具有两个 AssociationSet 元素的 EntityContainer 元素,其中每个 AssociationSet 元素还具有两个 End 元素:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

EntityContainer 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 EntityContainer 元素是一种用于容纳实体集、关联集和函数导入的逻辑容器。 概念模型实体容器通过 EntityContainerMapping 元素映射到存储模型实体容器。 存储模型实体容器描述数据库的结构:实体集描述表、关联集描述外键约束、函数导入描述数据库中的存储过程。

EntityContainer 元素可以具有零个或一个 Documentation 元素。 如果存在 Documentation 元素,则该元素必须在所有 EntitySetAssociationSetFunctionImport 元素前面。

EntityContainer 元素可以具有零个或多个下列子元素(按所列顺序):

  • EntitySet
  • AssociationSet
  • FunctionImport
  • 批注元素

可以扩展 EntityContainer 元素以将同一命名空间中另一个元素 EntityContainer 的内容包含在内。 若要包含另一个元素 EntityContainer 的内容,请在引用 EntityContainer 元素中将 Extends 特性的值设置为要包含的 EntityContainer 元素的名称。 所包含的 EntityContainer 元素的所有子元素都将被视为引用 EntityContainer 元素的子元素。

适用的属性

下表介绍可应用于 Using 元素的特性。

属性名称 为必填
Name 实体容器的名称。
扩展 同一命名空间中另一实体容器的名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 EntityContainer 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个 EntityContainer 元素,该元素定义三个实体集和两个关联集。

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

EntitySet 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 EntitySet 元素是用于某个实体类型的实例和自该实体类型派生的任何类型的实例的逻辑容器。 实体类型与实体集之间的关系类似于关系数据库中行与表之间的关系。 实体类型与行类似,它定义一组相关数据;而实体集与表类似,它包含该定义的实例。 实体集为对实体类型实例分组提供了一个构造,以便能够将它们映射到数据源中的相关数据结构。  

可以为特定实体类型定义多个实体集。

注意

EF 设计器不支持每个类型包含多个实体集的概念模型。

 

EntitySet 元素可以具有以下子元素(按所列顺序):

  • Documentation 元素(允许零个或一个元素)
  • Annotation 元素(允许零个或多个元素)

适用的属性

下表介绍可应用于 EntitySet 元素的特性。

属性名称 为必填
Name 实体集的名称。
EntityType 实体集包含其实例的实体类型的完全限定名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 EntitySet 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示具有三个 EntitySet 元素的 EntityContainer 元素:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

每个类型可以定义多个实体集 (MEST)。 下面的示例定义了一个实体容器,其中包含 Book 实体类型的两个实体集:

 <EntityContainer Name="BooksContainer" >
   <EntitySet Name="Books" EntityType="BooksModel.Book" />
   <EntitySet Name="FictionBooks" EntityType="BooksModel.Book" />
   <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
   <EntitySet Name="Authors" EntityType="BooksModel.Author" />
   <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
     <End Role="Book" EntitySet="Books" />
     <End Role="Publisher" EntitySet="Publishers" />
   </AssociationSet>
   <AssociationSet Name="BookAuthor" Association="BooksModel.BookAuthor">
     <End Role="Book" EntitySet="Books" />
     <End Role="Author" EntitySet="Authors" />
   </AssociationSet>
 </EntityContainer>

 

 

EntityType 元素 (CSDL)

EntityType 元素表示概念模型中顶级概念(例如客户或订单)的结构。 实体类型是应用程序中实体类型实例的模板。 每个模板都包含以下信息:

  • 唯一名称。 (必选。)
  • 由一个或多个属性定义的实体键。 (必选。)
  • 用于包含数据的属性。 (可选。)
  • 导航属性,用于从关联的一端导航至另一端。 (可选。)

在应用程序中,实体类型的实例表示一个特定对象(例如特定客户或订单)。 实体类型的每个实例在实体集中都必须具有唯一的实体类型。

只有两个实体类型实例的类型相同且其实体键的值也相同时,才认为它们是相等的。

EntityType 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • Key(零个或一个元素)
  • Property(零个或多个元素)
  • NavigationProperty(零个或多个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 EntityType 元素的特性

属性名称 为必填
Name 实体类型的名称。
BaseType 作为正在定义的实体类型的基类型的另一个实体类型。
摘要 TrueFalse,具体取决于实体类型是否为抽象类型。
OpenType TrueFalse,具体取决于实体类型是否为开放实体类型。
[!NOTE]
>OpenType 特性仅适用于与 ADO.NET 数据服务一起使用的概念模型中定义的实体类型。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 EntityType 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示 EntityType 元素,该元素具有三个 Property 元素和两个 NavigationProperty 元素:

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

 

EnumType 元素 (CSDL)

EnumType 元素代表枚举的类型。

EnumType 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • Member(零个或多个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 EnumType 元素的特性。

属性名称 为必填
Name 实体类型的名称。
IsFlags TrueFalse,具体取决于枚举类型是否可以用作一组标志。 默认值为 False
UnderlyingType Edm.ByteEdm.Int16Edm.Int32Edm.Int64Edm.SByte 定义类型的值范围。   枚举元素的默认基础类型是 Edm.Int32

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 EnumType 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个具有三个 Member 元素的 EnumType 元素:

 <EnumType Name="Color" IsFlags=”false” UnderlyingTyp=”Edm.Byte”>
   <Member Name="Red" />
   <Member Name="Green" />
   <Member Name="Blue" />
 </EntityType>

 

 

Function 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 Function 元素用于在概念模型中定义或声明函数。 函数通过使用 DefiningExpression 元素来定义。  

Function 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • Parameter(零个或多个元素)
  • DefiningExpression(零个或一个元素)
  • ReturnType (Function)(零个或一个元素)
  • 批注元素(零个或多个元素)

指定函数的返回类型时必须使用 ReturnType (Function) 元素或 ReturnType 特性(请参见下面的内容),但不能同时使用这两者。 可能的返回类型为任何 EdmSimpleType、实体类型、复杂类型、行类型或引用类型(或这些类型之一的集合)。

适用的属性

下表介绍可应用于 Function 元素的特性。

属性名称 为必填
Name 函数的名称。
ReturnType 函数返回的类型。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Function 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例使用 Function 元素定义用于返回教师已聘用年数的函数。

 <Function Name="YearsSince" ReturnType="Edm.Int32">
   <Parameter Name="date" Type="Edm.DateTime" />
   <DefiningExpression>
     Year(CurrentDateTime()) - Year(date)
   </DefiningExpression>
 </Function>

 

 

FunctionImport 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 FunctionImport 元素表示一个函数,该函数在数据源中定义,但通过概念模型对对象可用。 例如,存储模型中的 Function 元素可用于表示数据库中的存储过程。 概念模型中的 FunctionImport 元素表示实体框架应用程序中的相应函数,并使用 FunctionImportMapping 元素映射到存储模型函数。 在应用程序中调用函数时,会在数据库中执行相应的存储过程。

FunctionImport 元素可以具有以下子元素(按所列顺序):

  • Documentation(允许零个或一个元素)
  • Parameter(允许零个或多个元素)
  • Annotation 元素(允许零个或多个元素)
  • ReturnType (FunctionImport)(允许零个或多个元素)

应为函数接受的每个参数定义一个 Parameter 元素。

指定函数的返回类型时必须使用 ReturnType (FunctionImport) 元素或 ReturnType 特性(请参见下面的内容),但不能同时使用这两者。 返回类型值必须是 EdmSimpleType、EntityType 或 ComplexType 的集合。

适用的属性

下表介绍可应用于 FunctionImport 元素的特性。

属性名称 为必填
Name 导入的函数的名称。
ReturnType 函数返回的类型。 如果函数未返回值,则不要使用此属性。 否则,该值必须是 ComplexType、EntityType 或 EDMSimpleType 的集合。
EntitySet 如果函数返回实体类型的集合,EntitySet 的值必须为该集合所属的实体集。 否则,不得使用 EntitySet 属性。
IsComposable 如果该值设置为 true,则该函数是可组合的(表值函数)并可在 LINQ 查询中使用。  默认值为 false。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 FunctionImport 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个 FunctionImport 元素,该元素接受一个参数并返回实体类型的集合:

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

 

 

Key 元素 (CSDL)

Key 元素是 EntityType 元素的子元素,可定义实体键(实体类型的用于确定标识的一个或一组属性)。 构成实体键的属性是在设计时选择的。 实体键属性的值必须在运行时唯一标识实体集中的实体类型实例。 在选择构成实体键的属性时应确保实例在实体集中的唯一性。 Key 元素通过引用实体类型的一个或多个属性来定义实体键。

Key 元素可以具有以下子元素:

  • PropertyRef(一个或多个元素)
  • 批注元素(零个或多个元素)

适用的属性

可以将任意数量的批注特性(自定义 XML 特性)应用于 Key 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

示例

下面的示例定义一个名为 Book 的实体类型。 实体键通过引用实体类型的 ISBN 属性来定义。

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

对实体键使用 ISBN 属性是一个不错的选择,因为国际标准书号 (ISBN) 可以唯一地标识一本书。

以下示例显示一个具有实体键的实体类型 (Author),该实体键具有两个属性:NameAddress

 <EntityType Name="Author">
   <Key>
     <PropertyRef Name="Name" />
     <PropertyRef Name="Address" />
   </Key>
   <Property Type="String" Name="Name" Nullable="false" />
   <Property Type="String" Name="Address" Nullable="false" />
   <NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
                       FromRole="Author" ToRole="Book" />
 </EntityType>

 

对实体键使用 NameAddress 是一个合理的选择,因为两个同名作者住址相同的可能性很小。 但是,针对实体键的这种选择并不能绝对确保实体键在实体集中的唯一性。 在这种情况下,建议添加一个可用来唯一标识作者的属性,例如 AuthorId

 

Member 元素 (CSDL)

Member 元素是 EnumType 元素的子元素,定义枚举类型的成员。

适用的属性

下表介绍可应用于 FunctionImport 元素的特性。

属性名称 为必填
Name 成员名。
成员的值。 默认情况下,第一个成员具有值 0,并且每个连续枚举数的值将增加 1。 可能存在多个具有相同值的成员。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 FunctionImport 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个具有三个 Member 元素的 EnumType 元素:

 <EnumType Name="Color">
   <Member Name="Red" Value=”1”/>
   <Member Name="Green" Value=”3” />
   <Member Name="Blue" Value=”5”/>
 </EntityType>

 

 

NavigationProperty 元素定义一个导航属性,该属性提供对关联另一端的引用。 与使用 Property 元素定义的属性不同,导航属性不定义数据的形状和特征。 它们提供了一种在两个实体类型之间导航关联的方法。

注意,对于关联两端的两种实体类型,导航属性都是可选的。 如果您对于位于关联一端的实体类型定义一个导航属性,则不需要对于位于关联另一端的实体类型定义导航属性。

导航属性返回的数据类型是由其远程关联端的重数确定的。 例如,假设导航属性 OrdersNavProp 存在于 Customer 实体类型上并导航 CustomerOrder 之间的一对多关系。 因为导航属性的远程关联端的重数为多 (*),所以其数据类型是集合(属于 Order)。 同样,如果导航属性 CustomerNavProp 存在于 Order 实体类型上,其数据类型应为 Customer,因为远程端的重数为一 (1)。

NavigationProperty 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 NavigationProperty 元素的特性。

属性名称 为必填
Name 导航属性的名称。
关系 处于模型的作用域中的关联的名称。
ToRole 导航在此结束的关联端。 ToRole 特性的值必须与在其中一个关联端(关联端在 AssociationEnd 元素中定义)上定义的其中一个 Role 特性的值相同。
FromRole 导航从其开始的关联端。 Role 特性的值必须与在其中一个关联端(关联端在 AssociationEnd 元素中定义)上定义的其中一个 Role 特性的值相同。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 NavigationProperty 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

下面的示例定义一个实体类型 (Book),其中包含两个导航属性(PublishedByWrittenBy):

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

 

OnDelete 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 OnDelete 元素定义与关联相关的行为。 如果 Action 特性在关联的一端设置为 Cascade,则当删除这一端上的实体类型时,将删除关联的另一端上的相关实体类型。 如果两个实体类型之间的关联是主键对主键关系,则当删除关联的另一端上的主体对象时,将删除已加载的依赖对象,而不考虑 OnDelete 规范。  

注意

OnDelete 元素只影响应用程序的运行时行为,它不影响数据源中的行为。 在数据源中定义的行为应与在应用程序中定义的行为相同。

 

OnDelete 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 OnDelete 元素的特性。

属性名称 为必填
Action CascadeNone。 如果为 Cascade,则当删除主体实体类型时,将删除从属实体类型。 如果为 None,则当删除主体实体类型时,将不删除从属实体类型。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Association 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示用于定义 CustomerOrders 关联的 Association 元素。 OnDelete 元素指示:当删除 Customer 时,将删除与特定 Customer 相关且已加载到 ObjectContext 中的所有 Orders

 <Association Name="CustomerOrders">
   <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1">
         <OnDelete Action="Cascade" />
   </End>
   <End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
 </Association>

 

 

Parameter 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 Parameter 元素可以是 FunctionImport 元素或 Function 元素的子元素。

FunctionImport 元素应用程序

Parameter 元素(作为 FunctionImport 元素的子元素)用于为 CSDL 中声明的函数导入定义输入和输出参数。

Parameter 元素可以具有以下子元素(按所列顺序):

  • Documentation(允许零个或一个元素)
  • Annotation 元素(允许零个或多个元素)

适用的属性

下表介绍可应用于 Parameter 元素的特性。

属性名称 为必填
Name 参数的名称。
类型 参数类型。 值必须为 EDMSimpleType 或模型范围内的复杂类型。
模式 In、Out 或 InOut,具体取决于参数是输入参数、输出参数或输入/输出参数
MaxLength 允许的参数最长长度。
精度 参数的精度。
缩放 参数的确定位数。
SRID 空间系统引用标识符。 仅对空间类型的参数有效。 有关详细信息,请参阅 SRIDSRID (SQL Server)

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Parameter 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示具有一个 Parameter 子元素的 FunctionImport 元素。 函数接受一个输入参数并返回实体类型的集合。

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

 

Function 元素应用程序

Parameter 元素(作为 Function 元素的子元素)为概念模型中定义或声明的函数定义参数。

Parameter 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • CollectionType(零个或一个元素)
  • ReferenceType(零个或一个元素)
  • RowType(零个或一个元素)

注意

CollectionTypeReferenceTypeRowType 元素之一可以作为 Property 元素的子元素。

 

  • Annotation 元素(允许零个或多个元素)

注意

Annotation 元素必须出现在所有其他子元素之后。 只允许在 CSDL v2 及更高版本中使用 Annotation 元素。

 

适用的属性

下表介绍可应用于 Parameter 元素的特性。

属性名称 为必填
Name 参数的名称。
类型 参数类型。 参数可以是以下任意类型(或这些类型的集合):
EdmSimpleType
Entity Type — 实体类型
Complex Type — 复杂类型
行类型
Reference Type — 引用类型
可以为 Null True(默认值)或 False,具体取决于属性是否可以具有 null 值。
DefaultValue 属性的默认值。
MaxLength 属性值的最大长度。
FixedLength TrueFalse,具体取决于属性值是否将作为固定长度字符串存储。
精度 属性值的精度。
缩放 属性值的刻度。
SRID 空间系统引用标识符。 仅对空间类型的属性有效。 有关详细信息,请参阅 SRIDSRID (SQL Server)
Unicode TrueFalse,具体取决于属性值是否将作为 Unicode 字符串存储。
Collation 指定要在数据源中使用的排序的字符串。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Parameter 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示 Function 元素,该元素使用一个 Parameter 子元素来定义函数参数。

 <Function Name="GetYearsEmployed" ReturnType="Edm.Int32">
 <Parameter Name="Instructor" Type="SchoolModel.Person" />
   <DefiningExpression>
   Year(CurrentDateTime()) - Year(cast(Instructor.HireDate as DateTime))
   </DefiningExpression>
 </Function>

 

Principal 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 Principal 元素是 ReferentialConstraint 元素的子元素,用于定义引用约束的主体端。 ReferentialConstraint 元素定义的功能与关系数据库中的引用完整性约束类似。 与数据库表中的一个(或多个)列可以引用另一个表的主键相同,实体类型的一个(或多个)属性可以引用另一个实体类型的实体键。 所引用的实体类型称为约束的主体端。 引用主体端的实体类型称为约束的依赖端。 PropertyRef 元素用于指定依赖端引用哪些键。

Principal 元素可以具有以下子元素(按所列顺序):

  • PropertyRef(一个或多个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 Principal 元素的特性。

属性名称 为必填
角色 关联的主体端的实体类型的名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Principal 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示作为 PublishedBy 关联的定义一部分的 ReferentialConstraint 元素。 Publisher 实体类型的 Id 属性构成引用约束的主体端。

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

Property 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 Property 元素可以是 EntityType 元素、ComplexType 元素或 RowType 元素的子元素。

EntityType 和 ComplexType 元素应用程序

Property 元素(作为 EntityTypeComplexType 元素的子元素)定义实体类型实例或复杂类型实例要包含的数据的形状和特征。 概念模型中的属性类似于为类定义的属性。 正如类的属性定义类的形状和携带有关对象的信息一样,概念模型中的属性也定义实体类型的形状和携带有关实体类型实例的信息。

Property 元素可以具有以下子元素(按所列顺序):

  • Documentation 元素(允许零个或一个元素)
  • Annotation 元素(允许零个或多个元素)

以下方面可以应用于 Property 元素:NullableDefaultValueMaxLengthFixedLengthPrecisionScaleUnicodeCollationConcurrencyMode。 方面是一些 XML 特性,它们提供有关如何在数据存储区中存储属性值的信息。

注意

方面只能应用于类型为 EDMSimpleType 的属性。

 

适用的属性

下表介绍可应用于 Property 元素的特性

属性名称 为必填
Name 属性的名称。
类型 属性值的类型。 属性值类型必须为 EDMSimpleType 或模型范围内的复杂类型(由完全限定名称指示)。
可以为 Null True(默认值)或 False,取决于属性是否可以具有 null 值。
[!NOTE]
> 在 CSDL v1 中,复杂类型属性必须具有 Nullable="False"
DefaultValue 属性的默认值。
MaxLength 属性值的最大长度。
FixedLength TrueFalse,具体取决于属性值是否将作为固定长度字符串存储。
精度 属性值的精度。
缩放 属性值的刻度。
SRID 空间系统引用标识符。 仅对空间类型的属性有效。 有关详细信息,请参阅 SRIDSRID (SQL Server)
Unicode TrueFalse,具体取决于属性值是否将作为 Unicode 字符串存储。
Collation 指定要在数据源中使用的排序的字符串。
ConcurrencyMode (默认值)或固定。 如果此值设置为固定,会在乐观并发检查中使用属性值。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Property 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个具有三个 Property 元素的 EntityType 元素:

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

以下示例显示一个具有五个 Property 元素的 ComplexType 元素:

 <ComplexType Name="Address" >
   <Property Type="String" Name="StreetAddress" Nullable="false" />
   <Property Type="String" Name="City" Nullable="false" />
   <Property Type="String" Name="StateOrProvince" Nullable="false" />
   <Property Type="String" Name="Country" Nullable="false" />
   <Property Type="String" Name="PostalCode" Nullable="false" />
 </ComplexType>

 

RowType 元素应用

Property 元素(作为 RowType 元素的子元素)定义可以传递到模型定义函数或从该函数返回的数据的形状和特征。  

Property 元素可以正好具有以下子元素之一:

  • CollectionType
  • ReferenceType
  • RowType

Property 元素可以具有任意数量的子批注元素。

注意

只允许在 CSDL v2 及更高版本中使用 Annotation 元素。

 

适用的属性

下表介绍可应用于 Property 元素的特性

属性名称 为必填
Name 属性的名称。
类型 属性值的类型。
可以为 Null True(默认值)或 False,取决于属性是否可以具有 null 值。
[!NOTE]
> 在 CSDL v1 中,复杂类型属性必须具有 Nullable="False"
DefaultValue 属性的默认值。
MaxLength 属性值的最大长度。
FixedLength TrueFalse,具体取决于属性值是否将作为固定长度字符串存储。
精度 属性值的精度。
缩放 属性值的刻度。
SRID 空间系统引用标识符。 仅对空间类型的属性有效。 有关详细信息,请参阅 SRIDSRID (SQL Server)
Unicode TrueFalse,具体取决于属性值是否将作为 Unicode 字符串存储。
Collation 指定要在数据源中使用的排序的字符串。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Property 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示用于定义模型定义函数的返回类型的形状的 Property 元素。

 <Function Name="LastNamesAfter">
   <Parameter Name="someString" Type="Edm.String" />
   <ReturnType>
    <CollectionType>
      <RowType>
        <Property Name="FirstName" Type="Edm.String" Nullable="false" />
        <Property Name="LastName" Type="Edm.String" Nullable="false" />
      </RowType>
    </CollectionType>
   </ReturnType>
   <DefiningExpression>
             SELECT VALUE ROW(p.FirstName, p.LastName)
             FROM SchoolEntities.People AS p
             WHERE p.LastName &gt;= somestring
   </DefiningExpression>
 </Function>

 

 

PropertyRef 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 PropertyRef 元素引用实体类型的属性,以指示该属性将承担以下角色之一:

  • 实体键的一部分(实体类型的用于确定标识的一个或一组属性)。 可以使用一个或多个 PropertyRef 元素定义实体键。
  • 引用约束的依赖端或主体端。

PropertyRef 元素只能具有批注元素(零个或多个)作为子元素。

注意

只允许在 CSDL v2 及更高版本中使用 Annotation 元素。

 

适用的属性

下表介绍可应用于 PropertyRef 元素的特性

属性名称 为必填
Name 所引用属性的名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 PropertyRef 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

下面的示例定义一个实体类型 (Book)。 实体键通过引用实体类型的 ISBN 属性来定义。

 <EntityType Name="Book">
   <Key>
     <PropertyRef Name="ISBN" />
   </Key>
   <Property Type="String" Name="ISBN" Nullable="false" />
   <Property Type="String" Name="Title" Nullable="false" />
   <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
   <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                       FromRole="Book" ToRole="Publisher" />
   <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                       FromRole="Book" ToRole="Author" />
 </EntityType>

 

在下一个实例中,使用两个 PropertyRef 元素来指示两个属性(IdPublisherId)是引用约束的主体端和依赖端。

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

ReferenceType 元素 (CSDL)

概念架构定义语言 (CSDL) 中的 ReferenceType 元素指定对实体类型的引用。 ReferenceType 元素可以是以下元素的子元素:

  • ReturnType (Function)
  • 参数
  • CollectionType

定义函数的参数或返回类型时使用 ReferenceType 元素。

ReferenceType 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 ReferenceType 元素的特性。

属性名称 为必填
类型 所引用的实体类型的名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 ReferenceType 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个 ReferenceType 元素,它在接受对 Person 实体类型的引用的模型定义函数中用作 Parameter 元素的子元素:

 <Function Name="GetYearsEmployed" ReturnType="Edm.Int32">
   <Parameter Name="instructor">
     <ReferenceType Type="SchoolModel.Person" />
   </Parameter>
   <DefiningExpression>
   Year(CurrentDateTime()) - Year(cast(instructor.HireDate as DateTime))
   </DefiningExpression>
 </Function>

 

以下示例显示一个 ReferenceType 元素,它在返回对 Person 实体类型的引用的模型定义函数中用作 ReturnType (Function) 元素的子元素:

 <Function Name="GetPersonReference">
     <Parameter Name="p" Type="SchoolModel.Person" />
     <ReturnType>
         <ReferenceType Type="SchoolModel.Person" />
     </ReturnType>
     <DefiningExpression>
           REF(p)
     </DefiningExpression>
 </Function>

 

 

ReferentialConstraint 元素 (CSDL)

概念架构定义语言 (CSDL) 中的 ReferentialConstraint 元素定义的功能与关系数据库中的引用完整性约束类似。 与数据库表中的一个(或多个)列可以引用另一个表的主键相同,实体类型的一个(或多个)属性可以引用另一个实体类型的实体键。 所引用的实体类型称为约束的主体端。 引用主体端的实体类型称为约束的依赖端

如果在一个实体类型上公开的外键引用另一个实体类型的属性,则 ReferentialConstraint 元素定义这两个实体类型之间的关联。 因为 ReferentialConstraint 元素提供有关两个实体类型如何关联的信息,所以没必要使用映射规范语言 (MSL) 提供对应的 AssociationSetMapping 元素。 两个没有公开外键的实体类型之间的关联必须具有对应的 AssociationSetMapping 元素才能将关联信息映射到数据源。

如果外键没有在某个实体类型上公开,则 ReferentialConstraint 元素只能定义该实体类型与另一个实体类型之间的主键对主键约束。

ReferentialConstraint 元素可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • Principal(恰好一个元素)
  • Dependent(恰好一个元素)
  • 批注元素(零个或多个元素)

适用的属性

ReferentialConstraint 元素可以具有任意数量的批注特性(自定义 XML 特性)。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

示例

以下示例显示用作 PublishedBy 关联定义的一部分的 ReferentialConstraint 元素。

 <Association Name="PublishedBy">
   <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
   </End>
   <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
   <ReferentialConstraint>
     <Principal Role="Publisher">
       <PropertyRef Name="Id" />
     </Principal>
     <Dependent Role="Book">
       <PropertyRef Name="PublisherId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

 

 

ReturnType (Function) 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 ReturnType (Function) 元素为在 Function 元素中定义的函数指定返回类型。 还可以使用 ReturnType 特性指定函数返回类型

返回类型可以为任何 EdmSimpleType、实体类型、复杂类型、行类型、引用类型或这些类型之一的集合。

可以使用 ReturnType (Function) 元素的 Type 特性或使用以下子元素之一指定函数的返回类型:

  • CollectionType
  • ReferenceType
  • RowType

注意

如果你指定的函数返回类型同时具有 ReturnType (Function) 元素的 Type 特性和子元素之一,则不会对模型进行验证。

 

适用的属性

下表介绍可应用于 ReturnType (Function) 元素的特性。

属性名称 为必填
ReturnType 函数返回的类型。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 ReturnType (Function) 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例使用 Function 元素定义用于返回某书籍已付印年数的函数。 请注意,返回类型由 ReturnType (Function) 元素的 Type 特性指定。

 <Function Name="GetYearsInPrint">
   <ReturnType Type=="Edm.Int32">
   <Parameter Name="book" Type="BooksModel.Book" />
   <DefiningExpression>
    Year(CurrentDateTime()) - Year(cast(book.PublishedDate as DateTime))
   </DefiningExpression>
 </Function>

 

 

ReturnType (FunctionImport) 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 ReturnType (FunctionImport) 元素为在 FunctionImport 元素中定义的函数指定返回类型。 还可以使用 ReturnType 特性指定函数返回类型

返回类型可以是实体类型、复杂类型或 EdmSimpleType 的任何集合,

函数的返回类型由 ReturnType (FunctionImport) 元素的 Type 属性指定。

适用的属性

下表介绍可应用于 ReturnType (FunctionImport) 元素的特性。

属性名称 为必填
类型 函数返回的类型。 值必须 RowType、ComplexType、EntityType 或 EDMSimpleType 的集合。
EntitySet 如果函数返回实体类型的集合,EntitySet 的值必须为该集合所属的实体集。 否则,不得使用 EntitySet 属性。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 ReturnType (FunctionImport) 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例使用返回书籍和出版商的 FunctionImport。 请注意,该函数返回两个结果集,因此指定了两个 ReturnType (FunctionImport) 元素。

 <FunctionImport Name="GetBooksAndPublishers">
   <ReturnType Type=="Collection(BooksModel.Book )" EntitySet=”Books”>
   <ReturnType Type=="Collection(BooksModel.Publisher)" EntitySet=”Publishers”>
 </FunctionImport>

 

 

RowType 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 RowType 元素将未命名结构定义为在概念模型中定义的函数的参数或返回类型。

RowType 元素可以是以下元素的子元素:

  • CollectionType
  • 参数
  • ReturnType (Function)

RowType 元素可以具有以下子元素(按所列顺序):

  • Property(一个或多个)
  • 批注元素(零个或多个)

适用的属性

可以将任意数量的批注特性(自定义 XML 特性)应用于 RowType 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

示例

以下示例显示一个模型定义函数,它使用 CollectionType 元素来指定函数返回一个行集合(如在 RowType 元素中指定的一样)。

 <Function Name="LastNamesAfter">
   <Parameter Name="someString" Type="Edm.String" />
   <ReturnType>
    <CollectionType>
      <RowType>
        <Property Name="FirstName" Type="Edm.String" Nullable="false" />
        <Property Name="LastName" Type="Edm.String" Nullable="false" />
      </RowType>
    </CollectionType>
   </ReturnType>
   <DefiningExpression>
             SELECT VALUE ROW(p.FirstName, p.LastName)
             FROM SchoolEntities.People AS p
             WHERE p.LastName &gt;= somestring
   </DefiningExpression>
 </Function>

Schema 元素 (CSDL)

Schema 元素是概念模型定义的根元素。 它包括构成概念模型的对象、函数和容器的定义。

Schema 元素可包含下面的零个或多个子元素

  • 使用
  • EntityContainer
  • EntityType
  • EnumType
  • 关联
  • ComplexType
  • 功能

Schema 元素可能包含零个或一个批注元素。

注意

只允许在 CSDL v2 及更高版本中使用 Function 元素和 Annotation 元素。

 

Schema 元素使用 Namespace 特性为概念模型中的实体类型、复杂类型和关联对象定义命名空间。 在命名空间内,任何两个对象都不能同名。 命名空间可以跨多个 Schema 元素和多个 .csdl 文件。

概念模型命名空间与 Schema 元素的 XML 命名空间不同。 概念模型命名空间(由 Namespace 特性定义)是实体类型、复杂类型和关联类型的逻辑容器。 Schema 元素的 XML 命名空间(由 xmlns 特性指示)是用于 Schema 元素的子元素和特性的默认命名空间。 格式为 https://schemas.microsoft.com/ado/YYYY/MM/edm(其中,YYYY 和 MM 分别表示年度和月份)的 XML 命名空间是为 CSDL 保留的。 自定义元素和特性不能位于具有此格式的命名空间中。

适用的属性

下表介绍可应用于 Schema 元素的特性

属性名称 为必填
Namespace 概念模型的命名空间。 Namespace 特性的值用于构成类型的完全限定名称。 例如,如果名为 CustomerEntityType 位于 Simple.Example.Model 命名空间中,则 EntityType 的完全限定名称为 SimpleExampleModel.Customer。
不能将下面的字符串用作 Namespace 特性的值:SystemTransientEdmNamespace 特性的值不能与 SSDL Schema 元素中 Namespace 特性的值相同。
Alias 用于取代命名空间名称的标识符。 例如,如果名为 CustomerEntityType 位于 Simple.Example.Model 命名空间中,而 Alias 特性的值为 Model,则可以将 Model.Customer 用作 EntityType. 的完全限定名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Schema 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个 Schema 元素,该元素包含一个 EntityContainer 元素、两个 EntityType 元素和一个 Association 元素。

 <Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
      xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
      xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
       Namespace="ExampleModel" Alias="Self">
         <EntityContainer Name="ExampleModelContainer">
           <EntitySet Name="Customers"
                      EntityType="ExampleModel.Customer" />
           <EntitySet Name="Orders" EntityType="ExampleModel.Order" />
           <AssociationSet
                       Name="CustomerOrder"
                       Association="ExampleModel.CustomerOrders">
             <End Role="Customer" EntitySet="Customers" />
             <End Role="Order" EntitySet="Orders" />
           </AssociationSet>
         </EntityContainer>
         <EntityType Name="Customer">
           <Key>
             <PropertyRef Name="CustomerId" />
           </Key>
           <Property Type="Int32" Name="CustomerId" Nullable="false" />
           <Property Type="String" Name="Name" Nullable="false" />
           <NavigationProperty
                    Name="Orders"
                    Relationship="ExampleModel.CustomerOrders"
                    FromRole="Customer" ToRole="Order" />
         </EntityType>
         <EntityType Name="Order">
           <Key>
             <PropertyRef Name="OrderId" />
           </Key>
           <Property Type="Int32" Name="OrderId" Nullable="false" />
           <Property Type="Int32" Name="ProductId" Nullable="false" />
           <Property Type="Int32" Name="Quantity" Nullable="false" />
           <NavigationProperty
                    Name="Customer"
                    Relationship="ExampleModel.CustomerOrders"
                    FromRole="Order" ToRole="Customer" />
           <Property Type="Int32" Name="CustomerId" Nullable="false" />
         </EntityType>
         <Association Name="CustomerOrders">
           <End Type="ExampleModel.Customer"
                Role="Customer" Multiplicity="1" />
           <End Type="ExampleModel.Order"
                Role="Order" Multiplicity="*" />
           <ReferentialConstraint>
             <Principal Role="Customer">
               <PropertyRef Name="CustomerId" />
             </Principal>
             <Dependent Role="Order">
               <PropertyRef Name="CustomerId" />
             </Dependent>
           </ReferentialConstraint>
         </Association>
       </Schema>

 

 

TypeRef 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 TypeRef 元素提供对于现有命名类型的引用。 TypeRef 元素可以是 CollectionType 元素的子元素,CollectionType 元素用于指定函数具有集合作为参数或返回类型。

TypeRef 可以具有以下子元素(按所列顺序):

  • Documentation(零个或一个元素)
  • 批注元素(零个或多个元素)

适用的属性

下表介绍可应用于 TypeRef 元素的特性。 注意:DefaultValueMaxLengthFixedLengthPrecisionScaleUnicodeCollation 特性只适用于 EDMSimpleTypes

属性名称 为必填
类型 所引用的类型的名称。
可以为 Null True(默认值)或 False,取决于属性是否可以具有 null 值。
[!NOTE]
> 在 CSDL v1 中,复杂类型属性必须具有 Nullable="False"
DefaultValue 属性的默认值。
MaxLength 属性值的最大长度。
FixedLength TrueFalse,具体取决于属性值是否将作为固定长度字符串存储。
精度 属性值的精度。
缩放 属性值的刻度。
SRID 空间系统引用标识符。 仅对空间类型的属性有效。 有关详细信息,请参阅 SRIDSRID (SQL Server)
Unicode TrueFalse,具体取决于属性值是否将作为 Unicode 字符串存储。
Collation 指定要在数据源中使用的排序的字符串。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 CollectionType 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示一个模型定义函数,它使用 TypeRef 元素(作为 CollectionType 元素的子元素)来指定此函数接受 Department 实体类型的集合。

 <Function Name="GetAvgBudget">
      <Parameter Name="Departments">
          <CollectionType>
             <TypeRef Type="SchoolModel.Department"/>
          </CollectionType>
           </Parameter>
       <ReturnType Type="Collection(Edm.Decimal)"/>
       <DefiningExpression>
             SELECT VALUE AVG(d.Budget) FROM Departments AS d
       </DefiningExpression>
 </Function>

 

 

Using 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的 Using 元素导入其他命名空间中的概念模型的内容。 通过设置 Namespace 特性的值,你可以引用在其他概念模型中定义的实体类型、复杂类型和关联类型。 多个 Using 元素可以是 Schema 元素的子元素。

注意

CSDL 中的 Using 元素的作用与编程语言中的 using 语句并不完全类似。 通过使用编程语言中的 using 语句导入命名空间,你不会影响原始命名空间中的对象。 在 CSDL 中,导入的命名空间可以包含从原始命名空间中的实体类型导出的实体类型。 这可能影响在原始命名空间中声明的实体集。

 

Using 元素可以具有以下子元素:

  • Documentation(允许零个或一个元素)
  • Annotation 元素(允许零个或多个元素)

适用的属性

下表介绍可应用于 Using 元素的特性。

属性名称 为必填
Namespace 导入的命名空间的名称。
Alias 用于取代命名空间名称的标识符。 尽管此特性是必需的,但并不要求使用它来取代命名空间以限定对象名称。

 

注意

可以将任意数量的批注特性(自定义 XML 特性)应用于 Using 元素。 然而,自定义特性可能不属于为 CSDL 保留的任何 XML 命名空间。 任何两个自定义特性的完全限定名称都不能相同。

 

示例

以下示例显示用于导入在其他位置定义的命名空间的 Using 元素。 请注意,所显示的 Schema 元素的命名空间为 BooksModelPublisherEntityType 上的 Address 属性是在 ExtendedBooksModel 命名空间(使用 Using 元素导入)中定义的复杂类型。

 <Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
           xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
           xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
           Namespace="BooksModel" Alias="Self">

     <Using Namespace="BooksModel.Extended" Alias="BMExt" />

 <EntityContainer Name="BooksContainer" >
       <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
     </EntityContainer>

 <EntityType Name="Publisher">
       <Key>
         <PropertyRef Name="Id" />
       </Key>
       <Property Type="Int32" Name="Id" Nullable="false" />
       <Property Type="String" Name="Name" Nullable="false" />
       <Property Type="BMExt.Address" Name="Address" Nullable="false" />
     </EntityType>

 </Schema>

 

 

Annotation 特性 (CSDL)

以概念架构定义语言 (CSDL) 表示的批注特性是概念模型中的自定义 XML 特性。 除了具有有效的 XML 结构之外,还必须满足批注特性的以下各项条件:

  • 批注特性不能位于为 CSDL 保留的任何 XML 命名空间中。
  • 可以将多个批注特性应用于给定的 CSDL 元素。
  • 任何两个批注特性的完全限定名称都不能相同。

可以使用批注特性提供有关概念模型中元素的额外元数据。 可以在运行时通过使用 System.Data.Metadata.Edm 命名空间中的类访问批注元素中包含的元数据。

示例

以下示例显示一个具有一个批注特性 (CustomAttribute) 的 EntityType 元素。 本示例还演示了一个应用于实体类型元素的批注元素。

 <Schema Namespace="SchoolModel" Alias="Self"
         xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
         xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
   <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
     <EntitySet Name="People" EntityType="SchoolModel.Person" />
   </EntityContainer>
   <EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
               p:CustomAttribute="Data here.">
     <Key>
       <PropertyRef Name="PersonID" />
     </Key>
     <Property Name="PersonID" Type="Int32" Nullable="false"
               annotation:StoreGeneratedPattern="Identity" />
     <Property Name="LastName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="FirstName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="HireDate" Type="DateTime" />
     <Property Name="EnrollmentDate" Type="DateTime" />
     <p:CustomElement>
       Custom metadata.
     </p:CustomElement>
   </EntityType>
 </Schema>

 

下面的代码检索批注特性中的元数据并将其写入控制台:

 EdmItemCollection collection = new EdmItemCollection("School.csdl");
 MetadataWorkspace workspace = new MetadataWorkspace();
 workspace.RegisterItemCollection(collection);
 EdmType contentType;
 workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
 if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomAttribute"))
 {
     MetadataProperty annotationProperty =
         contentType.MetadataProperties["http://CustomNamespace.com:CustomAttribute"];
     object annotationValue = annotationProperty.Value;
     Console.WriteLine(annotationValue.ToString());
 }

 

上面的代码假定 School.csdl 文件位于项目的输出目录中,且您已将下面的 ImportsUsing 语句添加到项目中:

 using System.Data.Metadata.Edm;

 

 

Annotation 元素 (CSDL)

以概念架构定义语言 (CSDL) 表示的批注元素是概念模型中的自定义 XML 元素。 除了具有有效的 XML 结构之外,还必须满足批注元素的以下各项条件:

  • 批注元素不能位于为 CSDL 保留的任何 XML 命名空间中。
  • 多个批注元素可能是某个给定 CSDL 元素的子元素。
  • 任何两个批注元素的完全限定名称都不能相同。
  • 批注元素必须出现在给定 CSDL 元素的所有其他子元素之后。

可以使用批注元素提供有关概念模型中元素的额外元数据。 从 .NET Framework 版本 4 开始,可以在运行时通过使用 System.Data.Metadata.Edm 命名空间中的类访问批注元素中包含的元数据。

示例

以下示例显示一个具有一个批注元素 (CustomElement) 的 EntityType 元素。 本示例还演示了一个应用于实体类型元素的批注特性。

 <Schema Namespace="SchoolModel" Alias="Self"
         xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
         xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
   <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
     <EntitySet Name="People" EntityType="SchoolModel.Person" />
   </EntityContainer>
   <EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
               p:CustomAttribute="Data here.">
     <Key>
       <PropertyRef Name="PersonID" />
     </Key>
     <Property Name="PersonID" Type="Int32" Nullable="false"
               annotation:StoreGeneratedPattern="Identity" />
     <Property Name="LastName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="FirstName" Type="String" Nullable="false"
               MaxLength="50" Unicode="true" FixedLength="false" />
     <Property Name="HireDate" Type="DateTime" />
     <Property Name="EnrollmentDate" Type="DateTime" />
     <p:CustomElement>
       Custom metadata.
     </p:CustomElement>
   </EntityType>
 </Schema>

 

下面的代码检索批注元素中的元数据并将其写入控制台:

 EdmItemCollection collection = new EdmItemCollection("School.csdl");
 MetadataWorkspace workspace = new MetadataWorkspace();
 workspace.RegisterItemCollection(collection);
 EdmType contentType;
 workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
 if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomElement"))
 {
     MetadataProperty annotationProperty =
         contentType.MetadataProperties["http://CustomNamespace.com:CustomElement"];
     object annotationValue = annotationProperty.Value;
     Console.WriteLine(annotationValue.ToString());
 }

 

上面的代码假定 School.csdl 文件位于项目的输出目录中并且您已将下面的 ImportsUsing 语句添加到项目中:

 using System.Data.Metadata.Edm;

 

 

概念模型类型 (CSDL)

概念架构定义语言 (CSDL) 支持一组抽象基元数据类型(称为 EDMSimpleTypes),这些类型在概念模型中定义属性。 EDMSimpleTypes 是存储或承载环境中支持的基元数据类型的代理。

下表列出了 CSDL 支持的基元数据类型。 该表还列出了可应用于每个 EDMSimpleType 的方面。

EDMSimpleType 说明 适用的方面
Edm.Binary 包含二进制数据。 MaxLength、FixedLength、Nullable、Default
Edm.Boolean 包含值 truefalse Nullable、Default
Edm.Byte 包含一个无符号的 8 位整数值。 Precision、Nullable、Default
Edm.DateTime 表示日期和时间。 Precision、Nullable、Default
Edm.DateTimeOffset 包含以相对于 GMT 的偏移量(以分钟为单位)表示的日期和时间。 Precision、Nullable、Default
Edm.Decimal 包含一个具有固定精度和小数位数的数值。 Precision、Nullable、Default
Edm.Double 包含一个具有 15 位精度的浮点数 Precision、Nullable、Default
Edm.Float 包含一个具有 7 位精度的浮点数。 Precision、Nullable、Default
Edm.Guid 包含一个 16 字节的唯一标识符。 Precision、Nullable、Default
Edm.Int16 包含一个带符号的 16 位整数值。 Precision、Nullable、Default
Edm.Int32 包含一个带符号的 32 位整数值。 Precision、Nullable、Default
Edm.Int64 包含一个带符号的 64 位整数值。 Precision、Nullable、Default
Edm.SByte 包含一个带符号的 8 位整数值。 Precision、Nullable、Default
Edm.String 包含字符数据。 Unicode、FixedLength、MaxLength、Collation、Precision、Nullable、Default
Edm.Time 包含当天的时间。 Precision、Nullable、Default
Edm.Geography Nullable、Default、SRID
Edm.GeographyPoint Nullable、Default、SRID
Edm.GeographyLineString Nullable、Default、SRID
Edm.GeographyPolygon Nullable、Default、SRID
Edm.GeographyMultiPoint Nullable、Default、SRID
Edm.GeographyMultiLineString Nullable、Default、SRID
Edm.GeographyMultiPolygon Nullable、Default、SRID
Edm.GeographyCollection Nullable、Default、SRID
Edm.Geometry Nullable、Default、SRID
Edm.GeometryPoint Nullable、Default、SRID
Edm.GeometryLineString Nullable、Default、SRID
Edm.GeometryPolygon Nullable、Default、SRID
Edm.GeometryMultiPoint Nullable、Default、SRID
Edm.GeometryMultiLineString Nullable、Default、SRID
Edm.GeometryMultiPolygon Nullable、Default、SRID
Edm.GeometryCollection Nullable、Default、SRID

方面 (CSDL)

以概念架构定义语言 (CSDL) 表示的方面表示对于实体类型和复杂类型的属性的约束。 方面作为 XML 特性出现在以下 CSDL 元素上:

  • properties
  • TypeRef
  • 参数

下表描述了 CSDL 中支持的方面。 所有方面都是可选的。 当从概念模型生成数据库时,实体框架将使用以下所列出的一些方面。

注意

有关概念模型中的数据类型的信息,请参见概念模型类型 (CSDL)。

方面 说明 适用于 用于生成数据库 由运行时使用
Collation 指定在对属性值执行比较和排序操作时要使用的排序序列。 Edm.String
ConcurrencyMode 表示应使用属性的值来进行开放式并发检查。 所有 EDMSimpleType 属性
默认值 如果在安装时未提供值,则指定属性的默认值。 所有 EDMSimpleType 属性
FixedLength 指定属性值的长度是否可变。 Edm.BinaryEdm.String
MaxLength 指定属性值的最大长度。 Edm.BinaryEdm.String
可以为 Null 指定属性是否可以具有 null 值。 所有 EDMSimpleType 属性
精度 对于类型 Decimal 的属性,指定属性值可以具有的位数。 对于类型 TimeDateTimeDateTimeOffset 的属性,指定属性值的秒的小数部分的位数。 Edm.DateTimeEdm.DateTimeOffsetEdm.DecimalEdm.Time
缩放 指定属性值小数点右侧的位数。 Edm.Decimal
SRID 指定空间系统引用系统 ID。 有关详细信息,请参阅 SRIDSRID (SQL Server) Edm.Geography、Edm.GeographyPoint、Edm.GeographyLineString、Edm.GeographyPolygon、Edm.GeographyMultiPoint、Edm.GeographyMultiLineString、Edm.GeographyMultiPolygon、Edm.GeographyCollection、Edm.Geometry、Edm.GeometryPoint、Edm.GeometryLineString、Edm.GeometryPolygon、Edm.GeometryMultiPoint、Edm.GeometryMultiLineString、Edm.GeometryMultiPolygon、Edm.GeometryCollection
Unicode 指示是否将属性值存储为 Unicode。 Edm.String

注意

当从概念模型生成数据库时,生成数据库向导将识别 Property 元素的 StoreGeneratedPattern 特性的值(如果此元素位于以下命名空间中:https://schemas.microsoft.com/ado/2009/02/edm/annotation)。 此特性支持的值为 IdentityComputed。 值为 Identity 将生成一个数据库列,该列带有在数据库中生成的标识值。 值为 Computed 将生成一个列,该列带有一个在数据库中计算所得的值。

示例

下面的示例演示了应用于实体类型的属性的方面:

 <EntityType Name="Product">
   <Key>
     <PropertyRef Name="ProductId" />
   </Key>
   <Property Type="Int32"
             Name="ProductId" Nullable="false"
             a:StoreGeneratedPattern="Identity"
    xmlns:a="https://schemas.microsoft.com/ado/2009/02/edm/annotation" />
   <Property Type="String"
             Name="ProductName"
             Nullable="false"
             MaxLength="50" />
   <Property Type="String"
             Name="Location"
             Nullable="true"
             MaxLength="25" />
 </EntityType>