SSDL 规范

存储架构定义语言 (SSDL) 是一种基于 XML 的语言,用于描述实体框架应用程序的存储模型。

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

Entity Framework Designer(EF 设计器)在设计时将存储模型信息存储在 .edmx 文件中。 在生成时,Entity Designer 使用 .edmx 文件中的信息创建实体框架在运行时所需的 .ssdl 文件。

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

SSDL 版本 XML 命名空间
SSDL v1 https://schemas.microsoft.com/ado/2006/04/edm/ssdl
SSDL v2 https://schemas.microsoft.com/ado/2009/02/edm/ssdl
SSDL v3 https://schemas.microsoft.com/ado/2009/11/edm/ssdl

Association 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Association 元素指定参与基础数据库中的外键约束的表列。 两个必需的子 End 元素指定位于关联两端的表和各端的基数。 一个可选的 ReferentialConstraint 元素指定关联的主体端和依赖端以及参与列。 如果不存在 ReferentialConstraint 元素,则必须使用一个 AssociationSetMapping 元素指定关联的列映射

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

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

适用的属性

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

属性名称 为必填
Name 基础数据库中相应外键约束的名称。

注意

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

示例

下面的示例显示一个 Association 元素,该元素使用 ReferentialConstraint 元素指定参与 FK_CustomerOrders 外键约束的列

 <Association Name="FK_CustomerOrders">
   <End Role="Customers"
        Type="ExampleModel.Store.Customers" Multiplicity="1">
     <OnDelete Action="Cascade" />
   </End>
   <End Role="Orders"
        Type="ExampleModel.Store.Orders" Multiplicity="*" />
   <ReferentialConstraint>
     <Principal Role="Customers">
       <PropertyRef Name="CustomerId" />
     </Principal>
     <Dependent Role="Orders">
       <PropertyRef Name="CustomerId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

AssociationSet 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 AssociationSet 元素表示基础数据库中的两个表之间的外键约束。 参与外键约束的表列在 Association 元素中指定。 与给定的 AssociationSet 元素对应的 Association 元素在 AssociationSet 元素的 Association 特性中指定

SSDL 关联集通过 AssociationSetMapping 元素映射到 CSDL 关联集。 但是,如果使用 ReferentialConstraint 元素定义给定 CSDL 关联集的 CSDL 关联,则没必要提供对应的 AssociationSetMapping 元素。 在这种情况下,如果存在一个 AssociationSetMapping 元素,则它定义的映射将被 ReferentialConstraint 元素覆盖

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

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

适用的属性

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

属性名称 为必填
Name 关联集表示的外键约束的名称。
关联 定义参与外键约束的列的关联的名称。

注意

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

示例

下面的示例展示一个 AssociationSet 元素,该元素表示基础数据库中的 FK_CustomerOrders 外键约束

 <AssociationSet Name="FK_CustomerOrders"
                 Association="ExampleModel.Store.FK_CustomerOrders">
   <End Role="Customers" EntitySet="Customers" />
   <End Role="Orders" EntitySet="Orders" />
 </AssociationSet>

CollectionType 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 CollectionType 元素指定函数的返回类型是一个集合。 CollectionType 元素是 ReturnType 元素的子元素。 集合的类型是通过 RowType 子元素指定的:

注意

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

示例

以下示例显示一个函数,它使用 CollectionType 元素来指定函数返回一个行集合

   <Function Name="GetProducts" IsComposable="true" Schema="dbo">
     <ReturnType>
       <CollectionType>
         <RowType>
           <Property Name="ProductID" Type="int" Nullable="false" />
           <Property Name="CategoryID" Type="bigint" Nullable="false" />
           <Property Name="ProductName" Type="nvarchar" MaxLength="40" Nullable="false" />
           <Property Name="UnitPrice" Type="money" />
           <Property Name="Discontinued" Type="bit" />
         </RowType>
       </CollectionType>
     </ReturnType>
   </Function>

CommandText 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 CommandText 元素是 Function 元素的子元素,使用该元素可定义在数据库上执行的 SQL 语句。 通过 CommandText 元素可添加与数据库中存储过程类似的功能,但需要在存储模型中定义 CommandText 元素

CommandText 元素不能包含子元素。 CommandText 元素的正文必须是基础数据库的有效 SQL 语句

没有适用于 CommandText 元素的特性

示例

下面的示例显示具有一个 CommandText 子元素的 Function 元素。 通过将 UpdateProductInOrder 函数导入到概念模型,在 ObjectContext 上将此函数作为一个方法进行公开。  

 <Function Name="UpdateProductInOrder" IsComposable="false">
   <CommandText>
     UPDATE Orders
     SET ProductId = @productId
     WHERE OrderId = @orderId;
   </CommandText>
   <Parameter Name="productId"
              Mode="In"
              Type="int"/>
   <Parameter Name="orderId"
              Mode="In"
              Type="int"/>
 </Function>

DefiningQuery 元素 (SSDL)

通过以存储架构定义语言 (SSDL) 表示的 DefiningQuery 元素,你可以在基础数据库中直接执行 SQL 语句。 DefiningQuery 元素通常与数据库视图的用法类似,但视图是在存储模型中而非数据库中定义的。 DefiningQuery 元素中定义的视图可以通过 EntitySetMapping 元素映射到概念模型中的实体类型。 这些映射是只读的。  

下面的 SSDL 语法显示 EntitySet 的声明,后跟包含用于检索视图的查询的 DefiningQuery 元素

 <Schema>
     <EntitySet Name="Tables" EntityType="Self.STable">
         <DefiningQuery>
           SELECT  TABLE_CATALOG,
                   'test' as TABLE_SCHEMA,
                   TABLE_NAME
           FROM    INFORMATION_SCHEMA.TABLES
         </DefiningQuery>
     </EntitySet>
 </Schema>

可以使用实体框架中的存储过程对视图启用读写方案。 可以将数据源视图或实体 SQL 视图作为基表,用于检索数据和由存储过程处理的更改。

可以将 DefiningQuery 元素用于目标 Microsoft SQL Server Compact 3.5。 尽管 SQL Server Compact 3.5 不支持存储过程,但可以使用 DefiningQuery 元素实现类似功能。 另一个有用之处在于,可以创建存储过程以克服编程语言中使用的数据类型与数据源的数据类型的不匹配。 可以编写一个 DefiningQuery,它可以采用特定的参数集,然后调用具有不同参数集的存储过程(例如一个删除数据的存储过程)

Dependent 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Dependent 元素是 ReferentialConstraint 元素的子元素,用于定义外键约束(也称为“引用约束”)的依赖端。 Dependent 元素指定表中引用一个(或多个)主键列的一个(或多个)列。 PropertyRef 元素指定所引用的列。 Principal 元素指定由 Dependent 元素中指定的列引用的主键列

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

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

适用的属性

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

属性名称 为必填
角色 与相应 End 元素的 Role 特性(若使用)值相同的值;否则为包含引用列的表的名称

注意

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

示例

下面的示例显示一个 Association 元素,该元素使用 ReferentialConstraint 元素指定参与 FK_CustomerOrders 外键约束的列。 Dependent 元素将 Order 表的 CustomerId 列指定为约束的依赖端

 <Association Name="FK_CustomerOrders">
   <End Role="Customers"
        Type="ExampleModel.Store.Customers" Multiplicity="1">
     <OnDelete Action="Cascade" />
   </End>
   <End Role="Orders"
        Type="ExampleModel.Store.Orders" Multiplicity="*" />
   <ReferentialConstraint>
     <Principal Role="Customers">
       <PropertyRef Name="CustomerId" />
     </Principal>
     <Dependent Role="Orders">
       <PropertyRef Name="CustomerId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

Documentation 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Documentation 元素可用于提供有关在父元素中定义的对象的信息

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

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

适用的属性

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

示例

以下示例显示 Documentation 元素,它用作 EntityType 元素的子元素

 <EntityType Name="Customers">
   <Documentation>
     <Summary>Summary here.</Summary>
     <LongDescription>Long description here.</LongDescription>
   </Documentation>
   <Key>
     <PropertyRef Name="CustomerId" />
   </Key>
   <Property Name="CustomerId" Type="int" Nullable="false" />
   <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
 </EntityType>

End 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 End 元素指定处于基础数据库中外键约束一端的表和行数。 End 元素可以是 Association 元素或 AssociationSet 元素的子元素。 在每种情况下,可能的子元素以及适用的特性都不同。

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

End 元素(作为 Association 元素的子元素)分别使用 Type 和 Multiplicity 特性指定处于外键约束一端的表和行数。 外键约束的两端定义为 SSDL 关联的一部分;SSDL 关联必须仅具有两端。

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

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

适用的属性

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

属性名称 为必填
类型 处于外键约束端的 SSDL 实体集的完全限定名。
角色 相应的 ReferentialConstraint 元素(若使用)的 Principal 或 Dependent 元素中 Role 特性的值
多重性 1、0..1 或 *,具体取决于外键约束端处可存在的行数
1 指示外键约束端处仅存在一行
0..1 指示外键约束端处存在零行或一行
* 指示外键约束端处存在零行、一行或多行。

注意

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

示例

以下示例显示用于定义 FK_CustomerOrders 外键约束的 Association 元素。 在每个 End 元素上指定的 Multiplicity 值指示可以将 Orders 表中的多行与 Customers 表中的一行关联,但只能将 Customers 表中的一行与 Orders 表中的一行关联。 此外,OnDelete 元素指示如果删除 Customers 表中的行,则也会删除 Orders 表中引用 Customers 表中该特定行的所有行

 <Association Name="FK_CustomerOrders">
   <End Role="Customers"
        Type="ExampleModel.Store.Customers" Multiplicity="1">
     <OnDelete Action="Cascade" />
   </End>
   <End Role="Orders"
        Type="ExampleModel.Store.Orders" Multiplicity="*" />
   <ReferentialConstraint>
     <Principal Role="Customers">
       <PropertyRef Name="CustomerId" />
     </Principal>
     <Dependent Role="Orders">
       <PropertyRef Name="CustomerId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

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

End 元素(作为 AssociationSet 元素的子元素)指定处于基础数据库中外键约束一端的表

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

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

适用的属性

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

属性名称 为必填
EntitySet 处于外键约束一端的 SSDL 实体集的名称。
角色 在相应的 Association 元素的一个 End 元素上指定的其中一个 Role 特性的值

注意

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

示例

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

 <EntityContainer Name="ExampleModelStoreContainer">
   <EntitySet Name="Customers"
              EntityType="ExampleModel.Store.Customers"
              Schema="dbo" />
   <EntitySet Name="Orders"
              EntityType="ExampleModel.Store.Orders"
              Schema="dbo" />
   <AssociationSet Name="FK_CustomerOrders"
                   Association="ExampleModel.Store.FK_CustomerOrders">
     <End Role="Customers" EntitySet="Customers" />
     <End Role="Orders" EntitySet="Orders" />
   </AssociationSet>
 </EntityContainer>

EntityContainer 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 EntityContainer 元素描述实体框架应用程序中基础数据源的结构:SSDL 实体集(在 EntitySet 元素中定义)表示数据库中的表,SSDL 实体类型(在 EntityType 元素中定义)表示表中的行,关联集(在 AssociationSet 元素中定义)表示数据库中的外键约束。 存储模型实体容器通过 EntityContainerMapping 元素映射到概念模型实体容器。

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

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

  • EntitySet
  • AssociationSet
  • 批注元素

适用的属性

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

属性名称 为必填
Name 实体容器的名称。 此名称不能包含句点 (.)。

注意

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

示例

以下示例显示一个 EntityContainer 元素,该元素定义两个实体集和一个关联集。 注意,实体类型和关联类型名称由概念模型命名空间名称限定。

 <EntityContainer Name="ExampleModelStoreContainer">
   <EntitySet Name="Customers"
              EntityType="ExampleModel.Store.Customers"
              Schema="dbo" />
   <EntitySet Name="Orders"
              EntityType="ExampleModel.Store.Orders"
              Schema="dbo" />
   <AssociationSet Name="FK_CustomerOrders"
                   Association="ExampleModel.Store.FK_CustomerOrders">
     <End Role="Customers" EntitySet="Customers" />
     <End Role="Orders" EntitySet="Orders" />
   </AssociationSet>
 </EntityContainer>

EntitySet 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 EntitySet 元素表示基础数据库中的表或视图。 以 SSDL 表示的 EntityType 元素表示表或视图中的行。 EntitySet 元素的 EntityType 特性指定表示 SSDL 实体集中的行的特定 SSDL 实体类型。 CSDL 实体集和 SSDL 实体集之间的映射在 EntitySetMapping 元素中指定。

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

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

适用的属性

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

注意

某些特性(此处未列出)可以使用存储别名进行限定。 在更新模型时,模型更新向导会使用这些特性。

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

注意

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

示例

以下示例显示一个 EntityContainer 元素,该元素具有两个 EntitySet 元素和一个 AssociationSet 元素

 <EntityContainer Name="ExampleModelStoreContainer">
   <EntitySet Name="Customers"
              EntityType="ExampleModel.Store.Customers"
              Schema="dbo" />
   <EntitySet Name="Orders"
              EntityType="ExampleModel.Store.Orders"
              Schema="dbo" />
   <AssociationSet Name="FK_CustomerOrders"
                   Association="ExampleModel.Store.FK_CustomerOrders">
     <End Role="Customers" EntitySet="Customers" />
     <End Role="Orders" EntitySet="Orders" />
   </AssociationSet>
 </EntityContainer>

EntityType 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 EntityType 元素表示基础数据库的表或视图中的行。 以 SSDL 表示的 EntitySet 元素表示行所在的表或视图。 EntitySet 元素的 EntityType 特性指定表示 SSDL 实体集中的行的特定 SSDL 实体类型。 SSDL 实体类型与 CSDL 实体类型之间的映射在 EntityTypeMapping 元素中指定。

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

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

适用的属性

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

属性名称 为必填
Name 实体类型的名称。 此值通常与以实体类型表示行的表的名称相同。 此值可以不包含句点 (.)。

注意

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

示例

以下示例显示一个具有两个属性的 EntityType 元素

 <EntityType Name="Customers">
   <Documentation>
     <Summary>Summary here.</Summary>
     <LongDescription>Long description here.</LongDescription>
   </Documentation>
   <Key>
     <PropertyRef Name="CustomerId" />
   </Key>
   <Property Name="CustomerId" Type="int" Nullable="false" />
   <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
 </EntityType>

Function 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Function 元素指定基础数据库中存在的某个存储过程

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

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

指定函数的返回类型时必须使用 ReturnType 元素或 ReturnType 特性(请参见下面的内容),但不能同时使用这两者

可以将在存储模型中指定的存储过程导入应用程序的概念模型。 有关详细信息,请参阅使用存储过程进行查询。 Function 元素还可用于在存储模型中定义自定义函数。  

适用的属性

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

注意

某些特性(此处未列出)可以使用存储别名进行限定。 在更新模型时,模型更新向导会使用这些特性。

属性名称 为必填
Name 存储过程的名称。
ReturnType 存储过程的返回类型。
聚合 如果存储过程返回一个聚合值,则值为 True;否则,值为 False
BuiltIn 如果该函数为内置1函数,则值为 True;否则,值为 False
StoreFunctionName 存储过程的名称。
NiladicFunction 如果该函数为 niladic2 函数,则值为 True;否则,值为 False
IsComposable 如果该函数为可组合3函数,则值为 True;否则,值为 False
ParameterTypeSemantics 定义用于解析函数重载的类型语义的枚举。 该枚举是在提供程序清单中根据函数定义来定义的。 默认值为 AllowImplicitConversion
架构 在其中定义存储过程的架构的名称。

1 内置函数为在数据库中定义的函数。 有关在存储模型中定义的函数的信息,请参阅“CommandText 元素 (SSDL)”。

2 niladic 函数是不接受任何参数,且在调用时不需要使用括号的函数。

3 如果一个函数的输出可以作为另一个函数的输入,则这两个函数是可组合的。

注意

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

示例

下面的示例显示一个对应于 UpdateOrderQuantity 存储过程的 Function 元素。 该存储过程接受两个参数,且不返回值。

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

Key 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Key 元素表示基础数据库中某个表的主键。 Key 是 EntityType 元素的一个子元素,表示表中的一行。 主键在 Key 元素中定义,方式通过引用在 EntityType 元素上定义的一个或多个 Property 元素

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

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

没有适用于 Key 元素的特性

示例

下面的示例显示具有引用一个属性的键的 EntityType 元素

 <EntityType Name="Customers">
   <Documentation>
     <Summary>Summary here.</Summary>
     <LongDescription>Long description here.</LongDescription>
   </Documentation>
   <Key>
     <PropertyRef Name="CustomerId" />
   </Key>
   <Property Name="CustomerId" Type="int" Nullable="false" />
   <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
 </EntityType>

OnDelete 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 OnDelete 元素反映参与外键约束的行被删除时的数据库行为。 如果将 Action 设置为 Cascade,则还将删除引用要删除行的行。 如果将 Action 设置为 None,则不删除引用要删除行的行。 OnDelete 元素是 End 元素的子元素

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

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

适用的属性

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

属性名称 为必填
Action CascadeNone。 (值 Restricted 有效,但与 None 具有相同的行为。

注意

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

示例

以下示例显示用于定义 FK_CustomerOrders 外键约束的 Association 元素。 OnDelete 元素指示如果删除 Customers 表中的行,则也会删除 Orders 表中引用 Customers 表中该特定行的所有行

 <Association Name="FK_CustomerOrders">
   <End Role="Customers"
        Type="ExampleModel.Store.Customers" Multiplicity="1">
     <OnDelete Action="Cascade" />
   </End>
   <End Role="Orders"
        Type="ExampleModel.Store.Orders" Multiplicity="*" />
   <ReferentialConstraint>
     <Principal Role="Customers">
       <PropertyRef Name="CustomerId" />
     </Principal>
     <Dependent Role="Orders">
       <PropertyRef Name="CustomerId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

Parameter 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Parameter 元素是 Function 元素的子元素,用于为数据库中的存储过程指定参数

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

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

适用的属性

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

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

注意

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

示例

下面的示例显示具有两个 Parameter 元素(用于指定输入参数)的 Function 元素

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

Principal 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Principal 元素是 ReferentialConstraint 元素的子元素,用于定义外键约束(也称为“引用约束”)的主体端。 Principal 元素指定表中由一个(或多个)其他列引用的一个(或多个)主键列。 PropertyRef 元素指定所引用的列。 Dependent 元素指定引用在 Principal 元素中指定的主键列的列

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

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

适用的属性

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

属性名称 为必填
角色 与相应 End 元素的 Role 特性(若使用)值相同的值;否则为包含引用列的表的名称

注意

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

示例

下面的示例显示一个 Association 元素,该元素使用 ReferentialConstraint 元素指定参与 FK_CustomerOrders 外键约束的列。 Principal 元素将 Customer 表的 CustomerId 列指定为约束的主体端

 <Association Name="FK_CustomerOrders">
   <End Role="Customers"
        Type="ExampleModel.Store.Customers" Multiplicity="1">
     <OnDelete Action="Cascade" />
   </End>
   <End Role="Orders"
        Type="ExampleModel.Store.Orders" Multiplicity="*" />
   <ReferentialConstraint>
     <Principal Role="Customers">
       <PropertyRef Name="CustomerId" />
     </Principal>
     <Dependent Role="Orders">
       <PropertyRef Name="CustomerId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

Property 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Property 元素表示基础数据库中某个表的列。 Property 元素是 EntityType 元素的子元素,表示表中的行。 EntityType 元素上定义的每个 Property 元素均表示一列

Property 元素不能具有任何子元素

适用的属性

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

属性名称 为必填
Name 对应列的名称。
类型 对应列的类型。
可以为 Null True(默认值)或 False,具体取决于对应列是否可以具有 NULL 值
DefaultValue 对应列的默认值。
MaxLength 对应列的最大长度。
FixedLength True 或 False,具体取决于对应列值是否将作为固定长度字符串存储
精度 对应列的精度。
缩放 对应列的小数位数。
Unicode True 或 False,具体取决于对应列值是否将存储为 Unicode 字符串
Collation 指定要在数据源中使用的排序的字符串。
SRID 空间系统引用标识符。 仅对空间类型的属性有效。 有关详细信息,请参阅 SRIDSRID (SQL Server)
StoreGeneratedPattern None、Identity(如果对应列值为数据库中生成的标识)或者 Computed(如果对应列值为数据库中计算得出的)。 对 RowType 属性无效。

注意

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

示例

以下示例显示一个具有两个 Property 子元素的 EntityType 元素

 <EntityType Name="Customers">
   <Documentation>
     <Summary>Summary here.</Summary>
     <LongDescription>Long description here.</LongDescription>
   </Documentation>
   <Key>
     <PropertyRef Name="CustomerId" />
   </Key>
   <Property Name="CustomerId" Type="int" Nullable="false" />
   <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
 </EntityType>

PropertyRef 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 PropertyRef 元素引用在 EntityType 元素上定义的属性,以指示该属性将承担以下角色之一

  • 作为 EntityType 表示的表的主键的一部分。 可以使用一个或多个 PropertyRef 元素定义主键。 有关更多信息,请参见 Key 元素。
  • 是引用约束的依赖端或主体端。 有关更多信息,请参见 ReferentialConstraint 元素。

PropertyRef 元素只能具有以下子元素

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

适用的属性

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

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

注意

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

示例

下面的示例显示一个 PropertyRef 元素,该元素用于通过引用在 EntityType 元素上定义的属性来定义主键

 <EntityType Name="Customers">
   <Documentation>
     <Summary>Summary here.</Summary>
     <LongDescription>Long description here.</LongDescription>
   </Documentation>
   <Key>
     <PropertyRef Name="CustomerId" />
   </Key>
   <Property Name="CustomerId" Type="int" Nullable="false" />
   <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
 </EntityType>

ReferentialConstraint 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 ReferentialConstraint 元素表示基础数据库中的外键约束(也称为“引用完整性约束”)。 约束的主体端和依赖端分别由 Principal 和 Dependent 子元素指定。 通过 PropertyRef 元素引用参与主体端和依赖端的列。

ReferentialConstraint 元素是 Association 元素的可选子元素。 如果未使用 ReferentialConstraint 元素映射 Association 元素中指定的外键约束,则必须使用 AssociationSetMapping 元素执行此操作

ReferentialConstraint 元素可以具有以下子元素

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

适用的属性

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

示例

下面的示例显示一个 Association 元素,该元素使用 ReferentialConstraint 元素指定参与 FK_CustomerOrders 外键约束的列

 <Association Name="FK_CustomerOrders">
   <End Role="Customers"
        Type="ExampleModel.Store.Customers" Multiplicity="1">
     <OnDelete Action="Cascade" />
   </End>
   <End Role="Orders"
        Type="ExampleModel.Store.Orders" Multiplicity="*" />
   <ReferentialConstraint>
     <Principal Role="Customers">
       <PropertyRef Name="CustomerId" />
     </Principal>
     <Dependent Role="Orders">
       <PropertyRef Name="CustomerId" />
     </Dependent>
   </ReferentialConstraint>
 </Association>

ReturnType 元素 (SSDL)

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

函数的返回类型由 Type 特性或 ReturnType 元素指定

ReturnType 元素可以具有以下子元素

  • CollectionType(一个)

注意

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

示例

下面的示例使用返回行集合的 Function

   <Function Name="GetProducts" IsComposable="true" Schema="dbo">
     <ReturnType>
       <CollectionType>
         <RowType>
           <Property Name="ProductID" Type="int" Nullable="false" />
           <Property Name="CategoryID" Type="bigint" Nullable="false" />
           <Property Name="ProductName" Type="nvarchar" MaxLength="40" Nullable="false" />
           <Property Name="UnitPrice" Type="money" />
           <Property Name="Discontinued" Type="bit" />
         </RowType>
       </CollectionType>
     </ReturnType>
   </Function>

RowType 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 RowType 元素将未命名结构定义为在存储中定义的函数的返回类型

RowType 元素是 CollectionType 元素的子元素

RowType 元素可以具有以下子元素

  • Property(一个或多个)

示例

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

   <Function Name="GetProducts" IsComposable="true" Schema="dbo">
     <ReturnType>
       <CollectionType>
         <RowType>
           <Property Name="ProductID" Type="int" Nullable="false" />
           <Property Name="CategoryID" Type="bigint" Nullable="false" />
           <Property Name="ProductName" Type="nvarchar" MaxLength="40" Nullable="false" />
           <Property Name="UnitPrice" Type="money" />
           <Property Name="Discontinued" Type="bit" />
         </RowType>
       </CollectionType>
     </ReturnType>
   </Function>

Schema 元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的 Schema 元素是存储模型定义的根元素。 它包括构成存储模型的对象、函数和容器的定义。

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

  • 关联
  • EntityType
  • EntityContainer
  • 函数

Schema 元素使用 Namespace 特性为存储模型中的实体类型和关联对象定义命名空间。 在命名空间内,任何两个对象都不能同名。

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

适用的属性

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

属性名称 为必填
Namespace 存储模型的命名空间。 Namespace 特性的值用于构成类型的完全限定名称。 例如,如果名为 Customer 的 EntityType 位于 ExampleModel.Store 命名空间中,则 EntityType 的完全限定名称为 ExampleModel.Store.Customer
不能将下面的字符串用作 Namespace 特性的值:SystemTransientEdm。 Namespace 特性的值不能与 CSDL Schema 元素中 Namespace 特性的值相同
Alias 用于取代命名空间名称的标识符。 例如,如果名为 Customer 的 EntityType 位于 ExampleModel.Store 命名空间中,并且 Alias 特性的值为 StorageModel,则可以将 StorageModel.Customer 用作 EntityType 的完全限定名称
提供程序 数据提供程序。
ProviderManifestToken 一个标记,该标记指示提供程序清单返回到的提供程序。 没有为该标记定义格式。 标记的值由提供程序定义。 有关 SQL Server 提供程序清单令牌的信息,请参阅“用于实体框架的 SqlClient”。

示例

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

 <Schema Namespace="ExampleModel.Store"
       Alias="Self" Provider="System.Data.SqlClient"
       ProviderManifestToken="2008"
       xmlns="https://schemas.microsoft.com/ado/2009/11/edm/ssdl">
   <EntityContainer Name="ExampleModelStoreContainer">
     <EntitySet Name="Customers"
                EntityType="ExampleModel.Store.Customers"
                Schema="dbo" />
     <EntitySet Name="Orders"
                EntityType="ExampleModel.Store.Orders"
                Schema="dbo" />
     <AssociationSet Name="FK_CustomerOrders"
                     Association="ExampleModel.Store.FK_CustomerOrders">
       <End Role="Customers" EntitySet="Customers" />
       <End Role="Orders" EntitySet="Orders" />
     </AssociationSet>
   </EntityContainer>
   <EntityType Name="Customers">
     <Documentation>
       <Summary>Summary here.</Summary>
       <LongDescription>Long description here.</LongDescription>
     </Documentation>
     <Key>
       <PropertyRef Name="CustomerId" />
     </Key>
     <Property Name="CustomerId" Type="int" Nullable="false" />
     <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
   </EntityType>
   <EntityType Name="Orders" xmlns:c="http://CustomNamespace">
     <Key>
       <PropertyRef Name="OrderId" />
     </Key>
     <Property Name="OrderId" Type="int" Nullable="false"
               c:CustomAttribute="someValue"/>
     <Property Name="ProductId" Type="int" Nullable="false" />
     <Property Name="Quantity" Type="int" Nullable="false" />
     <Property Name="CustomerId" Type="int" Nullable="false" />
     <c:CustomElement>
       Custom data here.
     </c:CustomElement>
   </EntityType>
   <Association Name="FK_CustomerOrders">
     <End Role="Customers"
          Type="ExampleModel.Store.Customers" Multiplicity="1">
       <OnDelete Action="Cascade" />
     </End>
     <End Role="Orders"
          Type="ExampleModel.Store.Orders" Multiplicity="*" />
     <ReferentialConstraint>
       <Principal Role="Customers">
         <PropertyRef Name="CustomerId" />
       </Principal>
       <Dependent Role="Orders">
         <PropertyRef Name="CustomerId" />
       </Dependent>
     </ReferentialConstraint>
   </Association>
   <Function Name="UpdateOrderQuantity"
             Aggregate="false"
             BuiltIn="false"
             NiladicFunction="false"
             IsComposable="false"
             ParameterTypeSemantics="AllowImplicitConversion"
             Schema="dbo">
     <Parameter Name="orderId" Type="int" Mode="In" />
     <Parameter Name="newQuantity" Type="int" Mode="In" />
   </Function>
   <Function Name="UpdateProductInOrder" IsComposable="false">
     <CommandText>
       UPDATE Orders
       SET ProductId = @productId
       WHERE OrderId = @orderId;
     </CommandText>
     <Parameter Name="productId"
                Mode="In"
                Type="int"/>
     <Parameter Name="orderId"
                Mode="In"
                Type="int"/>
   </Function>
 </Schema>

Annotation 特性

以存储架构定义语言 (SSDL) 表示的批注特性在存储模型中是自定义 XML 特性,这些特性提供有关存储模型中元素的额外元数据。 除了具有有效的 XML 结构之外,以下约束也适用于批注特性:

  • 批注特性不能位于为 SSDL 保留的任何 XML 命名空间中。
  • 任何两个批注特性的完全限定名称都不能相同。

可以将多个批注特性应用于一个给定的 SSDL 元素。 可以在运行时通过使用 System.Data.Metadata.Edm 命名空间中的类访问批注元素中包含的元数据。

示例

下面的示例显示一个 EntityType 元素,该元素已将批注特性应用于 OrderId 属性。 本示例还显示一个已添加到 EntityType 元素的批注元素

 <EntityType Name="Orders" xmlns:c="http://CustomNamespace">
   <Key>
     <PropertyRef Name="OrderId" />
   </Key>
   <Property Name="OrderId" Type="int" Nullable="false"
             c:CustomAttribute="someValue"/>
   <Property Name="ProductId" Type="int" Nullable="false" />
   <Property Name="Quantity" Type="int" Nullable="false" />
   <Property Name="CustomerId" Type="int" Nullable="false" />
   <c:CustomElement>
     Custom data here.
   </c:CustomElement>
 </EntityType>

批注元素 (SSDL)

以存储架构定义语言 (SSDL) 表示的批注元素是存储模型中的自定义 XML 元素,可提供有关存储模型的额外元数据。 除了具有有效的 XML 结构之外,批注元素还应满足以下约束:

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

多个批注元素可能是某个给定 SSDL 元素的子元素。 从 .NET Framework 版本 4 开始,可以在运行时通过使用 System.Data.Metadata.Edm 命名空间中的类访问批注元素中包含的元数据。

示例

以下示例显示一个具有一个批注元素 (CustomElement) 的 EntityType 元素。 本示例还显示已应用于 OrderId 属性的批注特性

 <EntityType Name="Orders" xmlns:c="http://CustomNamespace">
   <Key>
     <PropertyRef Name="OrderId" />
   </Key>
   <Property Name="OrderId" Type="int" Nullable="false"
             c:CustomAttribute="someValue"/>
   <Property Name="ProductId" Type="int" Nullable="false" />
   <Property Name="Quantity" Type="int" Nullable="false" />
   <Property Name="CustomerId" Type="int" Nullable="false" />
   <c:CustomElement>
     Custom data here.
   </c:CustomElement>
 </EntityType>

方面 (SSDL)

以存储架构定义语言 (SSDL) 表达的方面表示对于 Property 元素中指定的列类型的约束。 Facet 是作为 Property 元素上的 XML 特性实现的

下表描述了 SSDL 中支持的方面:

方面 说明
排序规则 指定在对属性值执行比较和排序操作时要使用的排序序列。
FixedLength 指定列值的长度是否可变。
MaxLength 指定列值的最大长度。
精度 对于类型 Decimal 的属性,指定属性值可以具有的位数。 对于类型 Time、DateTime 和 DateTimeOffset 的属性,指定列值的秒的小数部分的位数
缩放 指定列值小数点右侧的位数。
Unicode 指示是否将列值存储为 Unicode。