CSDL 规范CSDL Specification

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

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

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

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

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

CSDL 版本XML 命名空间
CSDL v1https://schemas.microsoft.com/ado/2006/04/edm
CSDL v2https://schemas.microsoft.com/ado/2008/09/edm
CSDL v3https://schemas.microsoft.com/ado/2009/11/edm

Association 元素 (CSDL)Association Element (CSDL)

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

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

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

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

  • 文档(零个或一个元素)
  • End (正好2个元素)
  • ReferentialConstraint (零个或一个元素)
  • 批注元素(零个或多个元素)

适用的属性Applicable Attributes

下表描述了可应用于Association元素的特性。

属性名称是否必需
名称关联的名称。

备注

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

示例Example

下面的示例演示一个association元素,该元素定义在CustomerOrder实体类型上没有公开外键时的CustomerOrders关联。 关联的每个端点多重性值指示可以将多个订单与一个客户关联,但只能有一个客户与一个订单相关联。 此外, OnDelete元素指示在删除客户时,将删除与特定客户相关且已加载到 ObjectContext 的所有订单

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

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

  1. <Association Name="CustomerOrders">
  2. <End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" >
  3. <OnDelete Action="Cascade" />
  4. </End>
  5. <End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
  6. <ReferentialConstraint>
  7. <Principal Role="Customer">
  8. <PropertyRef Name="Id" />
  9. </Principal>
  10. <Dependent Role="Order">
  11. <PropertyRef Name="CustomerId" />
  12. </Dependent>
  13. </ReferentialConstraint>
  14. </Association>

AssociationSet 元素 (CSDL)AssociationSet Element (CSDL)

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

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

  • 文档(允许零个或一个元素)
  • End (只需要两个元素)
  • Annotation 元素(允许零个或多个元素)

Association特性指定关联集包含的关联类型。 构成关联集末尾的实体集是通过恰好两个子End元素指定的。

适用的属性Applicable Attributes

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

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

备注

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

示例Example

下面的示例演示具有两个AssociationSet元素的EntityContainer元素:

  1. <EntityContainer Name="BooksContainer" >
  2. <EntitySet Name="Books" EntityType="BooksModel.Book" />
  3. <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
  4. <EntitySet Name="Authors" EntityType="BooksModel.Author" />
  5. <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
  6. <End Role="Book" EntitySet="Books" />
  7. <End Role="Publisher" EntitySet="Publishers" />
  8. </AssociationSet>
  9. <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
  10. <End Role="Book" EntitySet="Books" />
  11. <End Role="Author" EntitySet="Authors" />
  12. </AssociationSet>
  13. </EntityContainer>

CollectionType 元素 (CSDL)CollectionType Element (CSDL)

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

  • CollectionType
  • ReferenceType
  • RowType
  • TypeRef

备注

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

适用的属性Applicable Attributes

下表介绍可应用于CollectionType元素的特性。 请注意, DefaultValueMaxLengthFixedLength精度小数位数Unicode排序规则特性仅适用于edmsimpletype的集合。

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

备注

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

示例Example

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

  1. <Function Name="LastNamesAfter">
  2. <Parameter Name="someString" Type="Edm.String"/>
  3. <ReturnType>
  4. <CollectionType ElementType="SchoolModel.Person"/>
  5. </ReturnType>
  6. <DefiningExpression>
  7. SELECT VALUE p
  8. FROM SchoolEntities.People AS p
  9. WHERE p.LastName >= someString
  10. </DefiningExpression>
  11. </Function>

下面的示例演示一个模型定义函数,该函数使用CollectionType元素来指定该函数返回行的集合(在RowType元素中指定)。

  1. <Function Name="LastNamesAfter">
  2. <Parameter Name="someString" Type="Edm.String" />
  3. <ReturnType>
  4. <CollectionType>
  5. <RowType>
  6. <Property Name="FirstName" Type="Edm.String" Nullable="false" />
  7. <Property Name="LastName" Type="Edm.String" Nullable="false" />
  8. </RowType>
  9. </CollectionType>
  10. </ReturnType>
  11. <DefiningExpression>
  12. SELECT VALUE ROW(p.FirstName, p.LastName)
  13. FROM SchoolEntities.People AS p
  14. WHERE p.LastName &gt;= somestring
  15. </DefiningExpression>
  16. </Function>

下面的示例演示一个模型定义的函数,该函数使用CollectionType元素来指定该函数接受作为参数的部门实体类型的集合。

  1. <Function Name="GetAvgBudget">
  2. <Parameter Name="Departments">
  3. <CollectionType>
  4. <TypeRef Type="SchoolModel.Department"/>
  5. </CollectionType>
  6. </Parameter>
  7. <ReturnType Type="Collection(Edm.Decimal)"/>
  8. <DefiningExpression>
  9. SELECT VALUE AVG(d.Budget) FROM Departments AS d
  10. </DefiningExpression>
  11. </Function>

ComplexType 元素 (CSDL)ComplexType Element (CSDL)

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

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

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

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

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

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

备注

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

示例Example

下面的示例显示了一个复杂类型Address,其中包含EdmSimpleType属性StreetAddressCityStateOrProvince国家/地区邮政编码

  1. <ComplexType Name="Address" >
  2. <Property Type="String" Name="StreetAddress" Nullable="false" />
  3. <Property Type="String" Name="City" Nullable="false" />
  4. <Property Type="String" Name="StateOrProvince" Nullable="false" />
  5. <Property Type="String" Name="Country" Nullable="false" />
  6. <Property Type="String" Name="PostalCode" Nullable="false" />
  7. </ComplexType>

若要将复杂类型地址(如上所示)定义为某个实体类型的属性,必须在实体类型定义中声明该属性类型。 下面的示例显示了在实体类型(发布者)上作为复杂类型的地址属性:

  1. <EntityType Name="Publisher">
  2. <Key>
  3. <PropertyRef Name="Id" />
  4. </Key>
  5. <Property Type="Int32" Name="Id" Nullable="false" />
  6. <Property Type="String" Name="Name" Nullable="false" />
  7. <Property Type="BooksModel.Address" Name="Address" Nullable="false" />
  8. <NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
  9. FromRole="Publisher" ToRole="Book" />
  10. </EntityType>

DefiningExpression 元素 (CSDL)DefiningExpression Element (CSDL)

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

备注

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

适用的属性Applicable Attributes

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

示例Example

下面的示例使用DefiningExpression元素来定义一个函数,该函数返回发布书籍之后的年数。 DefiningExpression元素的内容是以实体 SQL 编写的。

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

Dependent 元素 (CSDL)Dependent Element (CSDL)

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

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

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

适用的属性Applicable Attributes

下表描述了可应用于依赖元素的特性。

属性名称是否必需
角色关联的依赖端的实体类型的名称。

备注

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

示例Example

下面的示例演示了在PublishedBy关联的定义中使用的ReferentialConstraint元素。 Book实体类型的PublisherId属性构成了引用约束的依赖端。

  1. <Association Name="PublishedBy">
  2. <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
  3. </End>
  4. <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
  5. <ReferentialConstraint>
  6. <Principal Role="Publisher">
  7. <PropertyRef Name="Id" />
  8. </Principal>
  9. <Dependent Role="Book">
  10. <PropertyRef Name="PublisherId" />
  11. </Dependent>
  12. </ReferentialConstraint>
  13. </Association>

Documentation 元素 (CSDL)Documentation Element (CSDL)

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

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

  • 摘要:父元素的简要说明。 (零个或一个元素)
  • LongDescription:父元素的详细说明。 (零个或一个元素)
  • 批注元素. (零个或多个元素)

适用的属性Applicable Attributes

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

示例Example

下面的示例将文档元素显示为 EntityType 元素的子元素。 如果下面的代码片段在 .edmx 文件的 CSDL 内容中,则当你单击 Customer 实体类型时, SummaryLongDescription元素的内容将显示在 Visual Studio 的 “ 属性“ 窗口中。

  1. <EntityType Name="Customer">
  2. <Documentation>
  3. <Summary>Summary here.</Summary>
  4. <LongDescription>Long description here.</LongDescription>
  5. </Documentation>
  6. <Key>
  7. <PropertyRef Name="CustomerId" />
  8. </Key>
  9. <Property Type="Int32" Name="CustomerId" Nullable="false" />
  10. <Property Type="String" Name="Name" Nullable="false" />
  11. </EntityType>

End 元素 (CSDL)End Element (CSDL)

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

End 元素作为 Association 元素的子元素End Element as a Child of the Association Element

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

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

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

适用的属性Applicable Attributes

下表描述了当结束元素是Association元素的子元素时,可应用于该元素的特性。

属性名称是否必需
类型关联一端的实体类型的名称。
角色关联端的名称。 如果不提供名称,将使用关联端的实体类型的名称。
多重性10、1 ,具体取决于可在关联末尾的实体类型实例的数量。
1指示关联端刚好存在一个实体类型实例。
0 .0表示在关联端存在零个或一个实体类型实例。
指示关联端存在零个、一个或多个实体类型实例。

备注

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

示例Example

下面的示例演示了一个定义CustomerOrders关联的association元素。 关联的每个端点多重性值指示可以将多个订单与一个客户关联,但只能有一个客户与一个订单相关联。 此外, OnDelete元素指示在删除客户时,将删除与特定客户相关且已加载到 ObjectContext 的所有订单

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

End 元素作为 AssociationSet 元素的子元素End Element as a Child of the AssociationSet Element

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

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

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

备注

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

适用的属性Applicable Attributes

下表描述了当结束元素为AssociationSet元素的子元素时,可应用于该元素的特性。

属性名称是否必需
EntitySet定义父AssociationSet元素一端的EntitySet元素的名称。 必须在与父AssociationSet元素相同的实体容器中定义EntitySet元素。
角色关联集端的名称。 如果未使用Role属性,则关联集端的名称将为实体集的名称。

备注

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

示例Example

下面的示例演示具有两个AssociationSet元素的EntityContainer元素,每个元素都有两个End元素:

  1. <EntityContainer Name="BooksContainer" >
  2. <EntitySet Name="Books" EntityType="BooksModel.Book" />
  3. <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
  4. <EntitySet Name="Authors" EntityType="BooksModel.Author" />
  5. <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
  6. <End Role="Book" EntitySet="Books" />
  7. <End Role="Publisher" EntitySet="Publishers" />
  8. </AssociationSet>
  9. <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
  10. <End Role="Book" EntitySet="Books" />
  11. <End Role="Author" EntitySet="Authors" />
  12. </AssociationSet>
  13. </EntityContainer>

EntityContainer 元素 (CSDL)EntityContainer Element (CSDL)

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

EntityContainer元素可以有零个或一个文档元素。 如果存在文档元素,则它必须位于所有EntitySetAssociationSetFunctionImport元素之前。

EntityContainer元素可包含零个或多个下列子元素(按所列顺序):

  • EntitySet
  • AssociationSet
  • FunctionImport
  • 批注元素

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

适用的属性Applicable Attributes

下表描述了可应用于Using元素的特性。

属性名称是否必需
名称实体容器的名称。
延续同一命名空间中另一实体容器的名称。

备注

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

示例Example

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

  1. <EntityContainer Name="BooksContainer" >
  2. <EntitySet Name="Books" EntityType="BooksModel.Book" />
  3. <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
  4. <EntitySet Name="Authors" EntityType="BooksModel.Author" />
  5. <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
  6. <End Role="Book" EntitySet="Books" />
  7. <End Role="Publisher" EntitySet="Publishers" />
  8. </AssociationSet>
  9. <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
  10. <End Role="Book" EntitySet="Books" />
  11. <End Role="Author" EntitySet="Authors" />
  12. </AssociationSet>
  13. </EntityContainer>

EntitySet 元素 (CSDL)EntitySet Element (CSDL)

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

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

备注

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

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

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

适用的属性Applicable Attributes

下表描述了可应用于EntitySet元素的特性。

属性名称是否必需
名称实体集的名称。
EntityType实体集包含其实例的实体类型的完全限定名称。

备注

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

示例Example

下面的示例演示具有三个EntitySet元素的EntityContainer元素:

  1. <EntityContainer Name="BooksContainer" >
  2. <EntitySet Name="Books" EntityType="BooksModel.Book" />
  3. <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
  4. <EntitySet Name="Authors" EntityType="BooksModel.Author" />
  5. <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
  6. <End Role="Book" EntitySet="Books" />
  7. <End Role="Publisher" EntitySet="Publishers" />
  8. </AssociationSet>
  9. <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
  10. <End Role="Book" EntitySet="Books" />
  11. <End Role="Author" EntitySet="Authors" />
  12. </AssociationSet>
  13. </EntityContainer>

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

  1. <EntityContainer Name="BooksContainer" >
  2. <EntitySet Name="Books" EntityType="BooksModel.Book" />
  3. <EntitySet Name="FictionBooks" EntityType="BooksModel.Book" />
  4. <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
  5. <EntitySet Name="Authors" EntityType="BooksModel.Author" />
  6. <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
  7. <End Role="Book" EntitySet="Books" />
  8. <End Role="Publisher" EntitySet="Publishers" />
  9. </AssociationSet>
  10. <AssociationSet Name="BookAuthor" Association="BooksModel.BookAuthor">
  11. <End Role="Book" EntitySet="Books" />
  12. <End Role="Author" EntitySet="Authors" />
  13. </AssociationSet>
  14. </EntityContainer>

EntityType 元素 (CSDL)EntityType Element (CSDL)

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

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

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

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

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

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

适用的属性Applicable Attributes

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

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

备注

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

示例Example

下面的示例演示一个具有三个属性元素和两个NavigationProperty元素的EntityType元素:

  1. <EntityType Name="Book">
  2. <Key>
  3. <PropertyRef Name="ISBN" />
  4. </Key>
  5. <Property Type="String" Name="ISBN" Nullable="false" />
  6. <Property Type="String" Name="Title" Nullable="false" />
  7. <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
  8. <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
  9. FromRole="Book" ToRole="Publisher" />
  10. <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
  11. FromRole="Book" ToRole="Author" />
  12. </EntityType>

EnumType 元素(CSDL)EnumType Element (CSDL)

EnumType元素表示一个枚举类型。

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

  • 文档(零个或一个元素)
  • 成员(零个或多个元素)
  • 批注元素(零个或多个元素)

适用的属性Applicable Attributes

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

属性名称是否必需
名称实体类型的名称。
IsFlagsTrueFalse,具体取决于枚举类型是否可用作一组标志。 默认值为False。
UnderlyingTypeEdmedmedmedmedm ,定义类型的值的范围的。   枚举元素的默认基础类型为Edm

备注

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

示例Example

下面的示例演示具有三个成员元素的EnumType元素:

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

Function 元素 (CSDL)Function Element (CSDL)

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

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

  • 文档(零个或一个元素)
  • Parameter(零个或多个元素)
  • DefiningExpression(零个或一个元素)
  • ReturnType (函数)(零个或一个元素)
  • 批注元素(零个或多个元素)

函数的返回类型必须与returntype (function)元素或returntype属性(见下文)一起指定,但不能同时指定两者。 可能的返回类型为任何 EdmSimpleType、实体类型、复杂类型、行类型或引用类型(或这些类型之一的集合)。

适用的属性Applicable Attributes

下表描述了可应用于Function元素的特性。

属性名称是否必需
名称函数的名称。
ReturnType函数返回的类型。

备注

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

示例Example

下面的示例使用function元素来定义一个函数,该函数返回一个指导员后的年数。

  1. <Function Name="YearsSince" ReturnType="Edm.Int32">
  2. <Parameter Name="date" Type="Edm.DateTime" />
  3. <DefiningExpression>
  4. Year(CurrentDateTime()) - Year(date)
  5. </DefiningExpression>
  6. </Function>

FunctionImport 元素 (CSDL)FunctionImport Element (CSDL)

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

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

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

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

函数的返回类型必须与returntype (FunctionImport)元素或returntype属性(见下文)一起指定,但不能同时指定两者。 返回类型值必须是 EdmSimpleType、EntityType 或 ComplexType 的集合。

适用的属性Applicable Attributes

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

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

备注

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

示例Example

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

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

Key 元素 (CSDL)Key Element (CSDL)

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

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

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

适用的属性Applicable Attributes

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

示例Example

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

  1. <EntityType Name="Book">
  2. <Key>
  3. <PropertyRef Name="ISBN" />
  4. </Key>
  5. <Property Type="String" Name="ISBN" Nullable="false" />
  6. <Property Type="String" Name="Title" Nullable="false" />
  7. <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
  8. <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
  9. FromRole="Book" ToRole="Publisher" />
  10. <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
  11. FromRole="Book" ToRole="Author" />
  12. </EntityType>

由于国际标准图书编号(ISBN)唯一标识书籍,因此ISBN属性是实体键的一个不错选择。

下面的示例演示一个实体类型(作者),其中包含一个由两个属性、名称地址组成的实体键。

  1. <EntityType Name="Author">
  2. <Key>
  3. <PropertyRef Name="Name" />
  4. <PropertyRef Name="Address" />
  5. </Key>
  6. <Property Type="String" Name="Name" Nullable="false" />
  7. <Property Type="String" Name="Address" Nullable="false" />
  8. <NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
  9. FromRole="Author" ToRole="Book" />
  10. </EntityType>

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

Member 元素(CSDL)Member Element (CSDL)

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

适用的属性Applicable Attributes

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

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

备注

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

示例Example

下面的示例演示具有三个成员元素的EnumType元素:

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

NavigationProperty 元素 (CSDL)NavigationProperty Element (CSDL)

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

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

导航属性返回的数据类型是由其远程关联端的重数确定的。 例如,假设有一个导航属性OrdersNavProp,该属性存在于客户实体类型上,并在customerOrder之间导航一对多关联。 因为导航属性的远程关联端的重数为 many (*),所以其数据类型为集合(顺序)。 同样,如果 “订单“ 实体类型上存在导航属性CustomerNavProp,则其数据类型为Customer ,因为远程端的重数为一(1)。

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

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

适用的属性Applicable Attributes

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

属性名称是否必需
名称导航属性的名称。
关系处于模型的作用域中的关联的名称。
ToRole导航在此结束的关联端。 ToRole属性的值必须与某个关联端上定义的某个角色属性(在 AssociationEnd 元素中定义)的值相同。
FromRole导航从其开始的关联端。 FromRole属性的值必须与某个关联端上定义的某个角色属性(在 AssociationEnd 元素中定义)的值相同。

备注

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

示例Example

下面的示例定义了一个具有两个导航属性(PublishedByWrittenBy)的实体类型(Book):

  1. <EntityType Name="Book">
  2. <Key>
  3. <PropertyRef Name="ISBN" />
  4. </Key>
  5. <Property Type="String" Name="ISBN" Nullable="false" />
  6. <Property Type="String" Name="Title" Nullable="false" />
  7. <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
  8. <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
  9. FromRole="Book" ToRole="Publisher" />
  10. <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
  11. FromRole="Book" ToRole="Author" />
  12. </EntityType>

OnDelete 元素 (CSDL)OnDelete Element (CSDL)

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

备注

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

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

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

适用的属性Applicable Attributes

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

属性名称是否必需
ActionCascadeNone 如果在删除主体实体类型时将删除级联的依赖实体类型,则为。 如果为 ““,则在删除主体实体类型时不会删除从属实体类型。

备注

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

示例Example

下面的示例演示了一个定义CustomerOrders关联的association元素。 OnDelete元素指示在删除客户时,将删除与特定客户相关且已加载到 ObjectContext 的所有订单

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

Parameter 元素 (CSDL)Parameter Element (CSDL)

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

FunctionImport 元素应用程序FunctionImport Element Application

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

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

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

适用的属性Applicable Attributes

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

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

备注

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

示例Example

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

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

Function 元素应用程序Function Element Application

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

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

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

备注

只有一个CollectionTypeReferenceTypeRowType元素可以是属性元素的子元素。

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

备注

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

适用的属性Applicable Attributes

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

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

备注

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

示例Example

下面的示例演示一个使用一个参数子元素定义函数参数的函数元素。

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

Principal 元素 (CSDL)Principal Element (CSDL)

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

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

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

适用的属性Applicable Attributes

下表描述了可应用于主体元素的特性。

属性名称是否必需
角色关联的主体端的实体类型的名称。

备注

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

示例Example

下面的示例显示了ReferentialConstraint元素,它是PublishedBy关联定义的一部分。 发行者实体类型的Id属性构成了引用约束的主体端。

  1. <Association Name="PublishedBy">
  2. <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
  3. </End>
  4. <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
  5. <ReferentialConstraint>
  6. <Principal Role="Publisher">
  7. <PropertyRef Name="Id" />
  8. </Principal>
  9. <Dependent Role="Book">
  10. <PropertyRef Name="PublisherId" />
  11. </Dependent>
  12. </ReferentialConstraint>
  13. </Association>

Property 元素 (CSDL)Property Element (CSDL)

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

EntityType 和 ComplexType 元素应用程序EntityType and ComplexType Element Applications

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

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

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

以下方面可应用于属性元素:可以为 null默认值、 MaxLengthFixedLength精度小数位数Unicode排序规则ConcurrencyMode。 方面是一些 XML 特性,它们提供有关如何在数据存储区中存储属性值的信息。

备注

Facet 只能应用于EDMSimpleType类型的属性。

适用的属性Applicable Attributes

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

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

备注

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

示例Example

下面的示例演示一个具有三个属性元素的EntityType元素:

  1. <EntityType Name="Book">
  2. <Key>
  3. <PropertyRef Name="ISBN" />
  4. </Key>
  5. <Property Type="String" Name="ISBN" Nullable="false" />
  6. <Property Type="String" Name="Title" Nullable="false" />
  7. <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
  8. <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
  9. FromRole="Book" ToRole="Publisher" />
  10. <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
  11. FromRole="Book" ToRole="Author" />
  12. </EntityType>

下面的示例演示一个包含五个属性元素的ComplexType元素:

  1. <ComplexType Name="Address" >
  2. <Property Type="String" Name="StreetAddress" Nullable="false" />
  3. <Property Type="String" Name="City" Nullable="false" />
  4. <Property Type="String" Name="StateOrProvince" Nullable="false" />
  5. <Property Type="String" Name="Country" Nullable="false" />
  6. <Property Type="String" Name="PostalCode" Nullable="false" />
  7. </ComplexType>

RowType 元素应用RowType Element Application

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

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

  • CollectionType
  • ReferenceType
  • RowType

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

备注

仅在 CSDL v2 和更高版本中允许使用批注元素。

适用的属性Applicable Attributes

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

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

备注

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

示例Example

下面的示例演示了用于定义模型定义函数的返回类型的形状的属性元素。

  1. <Function Name="LastNamesAfter">
  2. <Parameter Name="someString" Type="Edm.String" />
  3. <ReturnType>
  4. <CollectionType>
  5. <RowType>
  6. <Property Name="FirstName" Type="Edm.String" Nullable="false" />
  7. <Property Name="LastName" Type="Edm.String" Nullable="false" />
  8. </RowType>
  9. </CollectionType>
  10. </ReturnType>
  11. <DefiningExpression>
  12. SELECT VALUE ROW(p.FirstName, p.LastName)
  13. FROM SchoolEntities.People AS p
  14. WHERE p.LastName &gt;= somestring
  15. </DefiningExpression>
  16. </Function>

PropertyRef 元素 (CSDL)PropertyRef Element (CSDL)

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

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

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

备注

仅在 CSDL v2 和更高版本中允许使用批注元素。

适用的属性Applicable Attributes

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

属性名称是否必需
名称所引用属性的名称。

备注

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

示例Example

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

  1. <EntityType Name="Book">
  2. <Key>
  3. <PropertyRef Name="ISBN" />
  4. </Key>
  5. <Property Type="String" Name="ISBN" Nullable="false" />
  6. <Property Type="String" Name="Title" Nullable="false" />
  7. <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
  8. <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
  9. FromRole="Book" ToRole="Publisher" />
  10. <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
  11. FromRole="Book" ToRole="Author" />
  12. </EntityType>

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

  1. <Association Name="PublishedBy">
  2. <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
  3. </End>
  4. <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
  5. <ReferentialConstraint>
  6. <Principal Role="Publisher">
  7. <PropertyRef Name="Id" />
  8. </Principal>
  9. <Dependent Role="Book">
  10. <PropertyRef Name="PublisherId" />
  11. </Dependent>
  12. </ReferentialConstraint>
  13. </Association>

ReferenceType 元素 (CSDL)ReferenceType Element (CSDL)

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

  • ReturnType (函数)
  • 参数
  • CollectionType

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

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

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

适用的属性Applicable Attributes

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

属性名称是否必需
类型所引用的实体类型的名称。

备注

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

示例Example

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

  1. <Function Name="GetYearsEmployed" ReturnType="Edm.Int32">
  2. <Parameter Name="instructor">
  3. <ReferenceType Type="SchoolModel.Person" />
  4. </Parameter>
  5. <DefiningExpression>
  6. Year(CurrentDateTime()) - Year(cast(instructor.HireDate as DateTime))
  7. </DefiningExpression>
  8. </Function>

下面的示例显示了ReferenceType元素,该元素用作模型定义的函数中的ReturnType (函数)元素的子元素,该函数返回对Person实体类型的引用:

  1. <Function Name="GetPersonReference">
  2. <Parameter Name="p" Type="SchoolModel.Person" />
  3. <ReturnType>
  4. <ReferenceType Type="SchoolModel.Person" />
  5. </ReturnType>
  6. <DefiningExpression>
  7. REF(p)
  8. </DefiningExpression>
  9. </Function>

ReferentialConstraint 元素 (CSDL)ReferentialConstraint Element (CSDL)

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

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

如果在实体类型上没有公开外键,则ReferentialConstraint元素只能定义实体类型和其他实体类型之间的主键到主键约束。

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

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

适用的属性Applicable Attributes

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

示例Example

下面的示例演示了在PublishedBy关联的定义中使用的ReferentialConstraint元素。

  1. <Association Name="PublishedBy">
  2. <End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
  3. </End>
  4. <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
  5. <ReferentialConstraint>
  6. <Principal Role="Publisher">
  7. <PropertyRef Name="Id" />
  8. </Principal>
  9. <Dependent Role="Book">
  10. <PropertyRef Name="PublisherId" />
  11. </Dependent>
  12. </ReferentialConstraint>
  13. </Association>

ReturnType (Function)元素(CSDL)ReturnType (Function) Element (CSDL)

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

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

函数的返回类型可以使用ReturnType (function)元素的type属性指定,也可以使用以下子元素之一指定:

  • CollectionType
  • ReferenceType
  • RowType

备注

如果指定的函数返回类型同时具有ReturnType (函数)元素的type属性和一个子元素,模型将不会验证。

适用的属性Applicable Attributes

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

属性名称是否必需
ReturnType函数返回的类型。

备注

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

示例Example

下面的示例使用function元素来定义一个函数,该函数返回书籍已打印的年数。 请注意,返回类型由ReturnType (函数)元素的type属性指定。

  1. <Function Name="GetYearsInPrint">
  2. <ReturnType Type=="Edm.Int32">
  3. <Parameter Name="book" Type="BooksModel.Book" />
  4. <DefiningExpression>
  5. Year(CurrentDateTime()) - Year(cast(book.PublishedDate as DateTime))
  6. </DefiningExpression>
  7. </Function>

ReturnType (FunctionImport)元素(CSDL)ReturnType (FunctionImport) Element (CSDL)

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

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

函数的返回类型是使用ReturnType (FunctionImport)元素的type属性指定的。

适用的属性Applicable Attributes

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

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

备注

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

示例Example

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

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

RowType 元素 (CSDL)RowType Element (CSDL)

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

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

  • CollectionType
  • 参数
  • ReturnType (函数)

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

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

适用的属性Applicable Attributes

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

示例Example

下面的示例演示一个模型定义函数,该函数使用CollectionType元素来指定该函数返回行的集合(在RowType元素中指定)。

  1. <Function Name="LastNamesAfter">
  2. <Parameter Name="someString" Type="Edm.String" />
  3. <ReturnType>
  4. <CollectionType>
  5. <RowType>
  6. <Property Name="FirstName" Type="Edm.String" Nullable="false" />
  7. <Property Name="LastName" Type="Edm.String" Nullable="false" />
  8. </RowType>
  9. </CollectionType>
  10. </ReturnType>
  11. <DefiningExpression>
  12. SELECT VALUE ROW(p.FirstName, p.LastName)
  13. FROM SchoolEntities.People AS p
  14. WHERE p.LastName &gt;= somestring
  15. </DefiningExpression>
  16. </Function>

Schema 元素 (CSDL)Schema Element (CSDL)

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

Schema元素可包含零个或多个下列子元素:

  • 使用
  • EntityContainer
  • EntityType
  • EnumType
  • 关联
  • ComplexType
  • 函数

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

备注

仅在 CSDL v2 和更高版本中允许Function元素和 annotation 元素。

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

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

适用的属性Applicable Attributes

下表描述了可对Schema元素应用的属性。

属性名称是否必需
Namespace概念模型的命名空间。 命名空间属性的值用于构成类型的完全限定名称。 例如,如果名为Customerentitytype位于 Simple 命名空间中,则entitytype的完全限定名称为 simpleexamplemodel.customer。
以下字符串不能用作Namespace特性的值: System暂时性Edm 命名空间属性的值不能与 SSDL 架构元素中namespace属性的值相同。
Alias用于取代命名空间名称的标识符。 例如,如果名为CustomerEntityType位于 Simple 命名空间,并且Alias属性的值为Model,则可以使用 model 作为 EntityType 的完全限定名称

备注

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

示例Example

下面的示例演示一个架构元素,该元素包含一个EntityContainer元素、两个EntityType元素和一个Association元素。

  1. <Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
  2. xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
  3. xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
  4. Namespace="ExampleModel" Alias="Self">
  5. <EntityContainer Name="ExampleModelContainer">
  6. <EntitySet Name="Customers"
  7. EntityType="ExampleModel.Customer" />
  8. <EntitySet Name="Orders" EntityType="ExampleModel.Order" />
  9. <AssociationSet
  10. Name="CustomerOrder"
  11. Association="ExampleModel.CustomerOrders">
  12. <End Role="Customer" EntitySet="Customers" />
  13. <End Role="Order" EntitySet="Orders" />
  14. </AssociationSet>
  15. </EntityContainer>
  16. <EntityType Name="Customer">
  17. <Key>
  18. <PropertyRef Name="CustomerId" />
  19. </Key>
  20. <Property Type="Int32" Name="CustomerId" Nullable="false" />
  21. <Property Type="String" Name="Name" Nullable="false" />
  22. <NavigationProperty
  23. Name="Orders"
  24. Relationship="ExampleModel.CustomerOrders"
  25. FromRole="Customer" ToRole="Order" />
  26. </EntityType>
  27. <EntityType Name="Order">
  28. <Key>
  29. <PropertyRef Name="OrderId" />
  30. </Key>
  31. <Property Type="Int32" Name="OrderId" Nullable="false" />
  32. <Property Type="Int32" Name="ProductId" Nullable="false" />
  33. <Property Type="Int32" Name="Quantity" Nullable="false" />
  34. <NavigationProperty
  35. Name="Customer"
  36. Relationship="ExampleModel.CustomerOrders"
  37. FromRole="Order" ToRole="Customer" />
  38. <Property Type="Int32" Name="CustomerId" Nullable="false" />
  39. </EntityType>
  40. <Association Name="CustomerOrders">
  41. <End Type="ExampleModel.Customer"
  42. Role="Customer" Multiplicity="1" />
  43. <End Type="ExampleModel.Order"
  44. Role="Order" Multiplicity="*" />
  45. <ReferentialConstraint>
  46. <Principal Role="Customer">
  47. <PropertyRef Name="CustomerId" />
  48. </Principal>
  49. <Dependent Role="Order">
  50. <PropertyRef Name="CustomerId" />
  51. </Dependent>
  52. </ReferentialConstraint>
  53. </Association>
  54. </Schema>

TypeRef 元素 (CSDL)TypeRef Element (CSDL)

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

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

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

适用的属性Applicable Attributes

下表介绍可应用于TypeRef元素的特性。 请注意, DefaultValueMaxLengthFixedLength精度小数位数Unicode排序规则特性仅适用于edmsimpletype

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

备注

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

示例Example

下面的示例演示一个模型定义函数,该函数使用TypeRef元素(作为CollectionType元素的子元素)来指定该函数接受部门实体类型的集合。

  1. <Function Name="GetAvgBudget">
  2. <Parameter Name="Departments">
  3. <CollectionType>
  4. <TypeRef Type="SchoolModel.Department"/>
  5. </CollectionType>
  6. </Parameter>
  7. <ReturnType Type="Collection(Edm.Decimal)"/>
  8. <DefiningExpression>
  9. SELECT VALUE AVG(d.Budget) FROM Departments AS d
  10. </DefiningExpression>
  11. </Function>

Using 元素 (CSDL)Using Element (CSDL)

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

备注

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

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

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

适用的属性Applicable Attributes

下表描述了可应用于Using元素的特性。

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

备注

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

示例Example

下面的示例演示用于导入在其他位置定义的命名空间的Using元素。 请注意,显示的架构元素的命名空间是 BooksModel的。 PublisherEntityType上的 Address 属性是在 ExtendedBooksModel 命名空间中定义的复杂类型(使用Using元素导入)。

  1. <Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
  2. xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
  3. xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
  4. Namespace="BooksModel" Alias="Self">
  5. <Using Namespace="BooksModel.Extended" Alias="BMExt" />
  6. <EntityContainer Name="BooksContainer" >
  7. <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
  8. </EntityContainer>
  9. <EntityType Name="Publisher">
  10. <Key>
  11. <PropertyRef Name="Id" />
  12. </Key>
  13. <Property Type="Int32" Name="Id" Nullable="false" />
  14. <Property Type="String" Name="Name" Nullable="false" />
  15. <Property Type="BMExt.Address" Name="Address" Nullable="false" />
  16. </EntityType>
  17. </Schema>

Annotation 特性 (CSDL)Annotation Attributes (CSDL)

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

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

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

示例Example

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

  1. <Schema Namespace="SchoolModel" Alias="Self"
  2. xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
  3. xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
  4. <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
  5. <EntitySet Name="People" EntityType="SchoolModel.Person" />
  6. </EntityContainer>
  7. <EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
  8. p:CustomAttribute="Data here.">
  9. <Key>
  10. <PropertyRef Name="PersonID" />
  11. </Key>
  12. <Property Name="PersonID" Type="Int32" Nullable="false"
  13. annotation:StoreGeneratedPattern="Identity" />
  14. <Property Name="LastName" Type="String" Nullable="false"
  15. MaxLength="50" Unicode="true" FixedLength="false" />
  16. <Property Name="FirstName" Type="String" Nullable="false"
  17. MaxLength="50" Unicode="true" FixedLength="false" />
  18. <Property Name="HireDate" Type="DateTime" />
  19. <Property Name="EnrollmentDate" Type="DateTime" />
  20. <p:CustomElement>
  21. Custom metadata.
  22. </p:CustomElement>
  23. </EntityType>
  24. </Schema>

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

  1. EdmItemCollection collection = new EdmItemCollection("School.csdl");
  2. MetadataWorkspace workspace = new MetadataWorkspace();
  3. workspace.RegisterItemCollection(collection);
  4. EdmType contentType;
  5. workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
  6. if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomAttribute"))
  7. {
  8. MetadataProperty annotationProperty =
  9. contentType.MetadataProperties["http://CustomNamespace.com:CustomAttribute"];
  10. object annotationValue = annotationProperty.Value;
  11. Console.WriteLine(annotationValue.ToString());
  12. }

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

  1. using System.Data.Metadata.Edm;

Annotation 元素 (CSDL)Annotation Elements (CSDL)

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

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

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

示例Example

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

  1. <Schema Namespace="SchoolModel" Alias="Self"
  2. xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
  3. xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
  4. <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
  5. <EntitySet Name="People" EntityType="SchoolModel.Person" />
  6. </EntityContainer>
  7. <EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
  8. p:CustomAttribute="Data here.">
  9. <Key>
  10. <PropertyRef Name="PersonID" />
  11. </Key>
  12. <Property Name="PersonID" Type="Int32" Nullable="false"
  13. annotation:StoreGeneratedPattern="Identity" />
  14. <Property Name="LastName" Type="String" Nullable="false"
  15. MaxLength="50" Unicode="true" FixedLength="false" />
  16. <Property Name="FirstName" Type="String" Nullable="false"
  17. MaxLength="50" Unicode="true" FixedLength="false" />
  18. <Property Name="HireDate" Type="DateTime" />
  19. <Property Name="EnrollmentDate" Type="DateTime" />
  20. <p:CustomElement>
  21. Custom metadata.
  22. </p:CustomElement>
  23. </EntityType>
  24. </Schema>

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

  1. EdmItemCollection collection = new EdmItemCollection("School.csdl");
  2. MetadataWorkspace workspace = new MetadataWorkspace();
  3. workspace.RegisterItemCollection(collection);
  4. EdmType contentType;
  5. workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
  6. if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomElement"))
  7. {
  8. MetadataProperty annotationProperty =
  9. contentType.MetadataProperties["http://CustomNamespace.com:CustomElement"];
  10. object annotationValue = annotationProperty.Value;
  11. Console.WriteLine(annotationValue.ToString());
  12. }

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

  1. using System.Data.Metadata.Edm;

概念模型类型 (CSDL)Conceptual Model Types (CSDL)

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

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

EDMSimpleType说明适用的方面
Edm包含二进制数据。MaxLength、FixedLength、Nullable、Default
Edm.Boolean包含值truefalseNullable、Default
Edm包含一个无符号的 8 位整数值。Precision、Nullable、Default
Edm. DateTime表示日期和时间。Precision、Nullable、Default
Edm.DateTimeOffset包含日期和时间,采用相对于 GMT 的偏移量(以分钟为单位)的形式。Precision、Nullable、Default
Edm包含一个具有固定精度和小数位数的数值。Precision、Nullable、Default
Edm.Double包含具有15位精度的浮点数Precision、Nullable、Default
Edm包含一个具有 7 位精度的浮点数。Precision、Nullable、Default
Edm Guid包含一个 16 字节的唯一标识符。Precision、Nullable、Default
Edm包含一个带符号的 16 位整数值。Precision、Nullable、Default
Edm.Int32包含一个带符号的 32 位整数值。Precision、Nullable、Default
Edm.Int64包含一个带符号的 64 位整数值。Precision、Nullable、Default
Edm包含一个带符号的 8 位整数值。Precision、Nullable、Default
Edm.String包含字符数据。Unicode、FixedLength、MaxLength、Collation、Precision、Nullable、Default
Edm。时间包含当天的时间。Precision、Nullable、Default
EdmNullable、Default、SRID
Edm.GeographyPointNullable、Default、SRID
Edm. GeographyLineStringNullable、Default、SRID
Edm. GeographyPolygonNullable、Default、SRID
Edm. GeographyMultiPointNullable、Default、SRID
Edm. GeographyMultiLineStringNullable、Default、SRID
Edm. GeographyMultiPolygonNullable、Default、SRID
Edm. GeographyCollectionNullable、Default、SRID
EdmNullable、Default、SRID
Edm. GeometryPointNullable、Default、SRID
Edm. GeometryLineStringNullable、Default、SRID
Edm. GeometryPolygonNullable、Default、SRID
Edm. GeometryMultiPointNullable、Default、SRID
Edm. GeometryMultiLineStringNullable、Default、SRID
Edm. GeometryMultiPolygonNullable、Default、SRID
Edm. GeometryCollectionNullable、Default、SRID

方面 (CSDL)Facets (CSDL)

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

  • 属性
  • TypeRef
  • 参数

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

备注

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

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

备注

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

示例Example

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

  1. <EntityType Name="Product">
  2. <Key>
  3. <PropertyRef Name="ProductId" />
  4. </Key>
  5. <Property Type="Int32"
  6. Name="ProductId" Nullable="false"
  7. a:StoreGeneratedPattern="Identity"
  8. xmlns:a="https://schemas.microsoft.com/ado/2009/02/edm/annotation" />
  9. <Property Type="String"
  10. Name="ProductName"
  11. Nullable="false"
  12. MaxLength="50" />
  13. <Property Type="String"
  14. Name="Location"
  15. Nullable="true"
  16. MaxLength="25" />
  17. </EntityType>