SSDL 規格
注意
SSDL v1 不受支援,請更新至 V3
存放結構定義語言 (SSDL) 是一種 XML 架構語言,會描述 Entity Framework 應用程式的儲存體模型。
在 Entity Framework 應用程式中,儲存體模型中繼資料會從 .ssdl 檔案 (以 SSDL 撰寫) 載入 System.Data.Metadata.Edm.StoreItemCollection 的執行個體,且可以使用 System.Data.Metadata.Edm.MetadataWorkspace 類別的方法來存取。 Entity Framework 會使用儲存體模型中繼資料,將針對概念模型的查詢轉譯為存放區專用的命令。
Entity Framework Designer (EF Designer) 會在設計階段將儲存體模型資訊儲存為 .edmx 檔案。 在建置階段,Entity Designer 會使用 .edmx 檔案中的資訊,建立 Entity Framework 在執行階段所需的 .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 (零或一個)
- Annotation 元素 (零或多個)
適用屬性
下表說明可套用至 Association 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 基礎資料庫中對應之外部索引鍵條件約束的名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Association 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為 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 關聯集。 不過,如果特定 CSDL 關聯集的 CSDL 關聯是使用 ReferentialConstraint 元素來定義,則對應的 AssociationSetMapping 元素並非必要。 在此情況下,如果 AssociationSetMapping 元素存在,它定義的對應會由 ReferentialConstraint 元素所覆寫。
AssociationSet 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個)
- End (零或兩個)
- Annotation 元素 (零或多個)
適用屬性
下表說明可套用至 AssociationSet 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 關聯集所表示之外部索引鍵條件約束的名稱。 |
關聯 | Yes | 定義參與外部索引鍵條件約束之資料行的關聯名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 AssociationSet 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 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 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的函式使用 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>
您可以使用 Entity Framework 的預存程序來啟用針對檢視的讀寫情境。 您可以將資料來源檢視或 Entity 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 (一或多個)
- Annotation 元素 (零或多個)
適用屬性
下表說明可套用至 Dependent 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Role | Yes | 與對應的 End 元素的 Role 屬性相同的值,否則,就是包含參照的欄的資料表名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Dependent 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為 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 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 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 (零或一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明當 End 元素是 Association 元素的子系時,可套用至該元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
類型 | Yes | 位於外部索引鍵條件約束端點的 SSDL 實體集的完整合格名稱。 |
Role | No | 對應的 ReferentialConstraint 元素 (如有使用) 的 Principal 或 Dependent 元素中的 Role 屬性值。 |
多重性 | Yes | 1、0..1 或 * 需視於位於外部索引鍵條件約束端點的列數而定。 1 表示外部索引鍵條件約束端存在正好一個列。 0..1 表示外部索引鍵條件約束端存在零或一個列。 * 表示外部索引鍵條件約束端存在零、一或多個列。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 End 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Association 元素定義了 FK_CustomerOrders 外部索引鍵條件約束。 在每個 End 元素指定的 Multiplicity 值表示 Orders 資料表中有許多列可以與 Customers 資料表中的列建立關聯,但 Customers 資料表中只有一個列可以與 Orders 資料表中的列建立關聯。 此外,OnDelete 元素表示,如果 Customers 資料表中的列遭刪除,則在 Customers 資料表參照特定列的 Orders 資料表所有列都會遭刪除。
<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 (零或一個)
- Annotation 元素 (零或多個)
適用屬性
下表說明當 End 元素是 AssociationSet 元素的子系時,可套用至該元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
EntitySet | Yes | 位於外部索引鍵條件約束端點的 SSDL 實體集名稱。 |
Role | No | 在對應的 Association 元素某一 End 元素上指定的 Role 屬性的值。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 End 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有 AssociationSet 元素的 EntityContainer 元素,這個元素有兩個 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 元素描述了 Entity Framework 應用程式基礎資料來源的結構:SSDL 實體集 (定義於 EntitySet 元素) 代表資料庫中的資料表、SSDL 實體類型 (定義於 EntityType 元素) 代表資料表中的列,而關聯集 (定義於 AssociationSet 元素) 則代表資料庫中的外部索引鍵條件約束。 儲存體模型實體容器會透過 EntityContainerMapping 元素對應至概念模型實體容器。
EntityContainer 元素可有零或一個 Documentation 元素。 如果 Documentation 元素存在,它必須位於所有其他子元素之前。
EntityContainer 元素可以有零或多個以下子元素 (依所列順序):
- EntitySet
- AssociationSet
- Annotation 項目
適用屬性
下表說明可套用至 EntityContainer 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體容器的名稱。 此名稱不得包含任何句號 (.)。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 EntityContainer 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 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 (零或一個元素)
- Annotation 項目
適用屬性
下表說明可套用至 EntitySet 元素的屬性。
注意
某些屬性 (此處未列出) 可能符合 store 別名的資格。 更新模型時,更新模型精靈會使用這些屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體集的名稱。 |
EntityType | Yes | 實體類型 (實體集包含其執行個體) 的完整名稱。 |
結構描述 | No | 資料庫結構描述。 |
Table | No | 資料庫資料表。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 EntitySet 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 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 (零或一個元素)
- Annotation 項目
適用屬性
下表說明可套用至 EntityType 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體類型的名稱。 此值通常與資料表名稱相同,在資料表中實體類型表示資料列。 此值不可以包含句號 (.)。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 EntityType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有兩個 屬性的 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 (零或多個)
- Annotation 元素 (零或多個)
函式的傳回類型必須以 ReturnType 元素或 ReturnType 屬性來指定 (請參閱下方),但不能同時指定兩者。
儲存體模型中所指定的預存程序可以匯入應用程式的概念模型中。 如需詳細資訊,請參閱以預存程序進行查詢。 Function 元素也可用來在儲存體模型定義自訂函式。
適用屬性
下表說明可套用至 Function 元素的屬性。
注意
某些屬性 (此處未列出) 可能符合 store 別名的資格。 更新模型時,更新模型精靈會使用這些屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 預存程序的名稱。 |
ReturnType | No | 預存程序的傳回型別。 |
彙總 | No | 如果預存程序傳回匯總值,則為 True,否則為 False。 |
BuiltIn | No | 如果函式是內建的 1 函式,則為 True,否則為 False。 |
StoreFunctionName | No | 預存程序的名稱。 |
NiladicFunction | No | 如果函式是 niladic 2 函式,則為 True,否則為 False。 |
IsComposable | No | 如果函式是可組合的 3 函式,則為 True,否則為 False。 |
ParameterTypeSemantics | No | 列舉型別,可定義用來解決函式多載的型別語意。 列舉型別會定義在每個函式定義的提供者資訊清單。 預設值為 AllowImplicitConversion。 |
結構描述 | No | 結構描述的名稱,可在其中定義預存程序。 |
1 內建函式是在資料庫中定義的函式。 如需瞭解在儲存體模型定義的函式,請參閱 CommandText 元素 (SSDL)。
2 niladic 函式是不接受任何參數,且呼叫時不需要括號的函式。
3 如果某個函式的輸出可以是另一個函式的輸入,則兩個函式是可組合。
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Function 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為對應至 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 (一或多個)
- Annotation 項目
任何屬性都不適用於 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 元素會在參與外部索引鍵條件約束的列遭刪除時,反映資料庫行為。 如果動作設定為 Cascade,參照的列遭刪除的列也會一併遭刪除。 如果動作設定為 None,參照的列遭刪除的列就不會一併遭刪除。 OnDelete 元素是 End 元素的子元素。
OnDelete 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個)
- Annotation 元素 (零或多個)
適用屬性
下表說明可套用至 OnDelete 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
動作 | Yes | Cascade 或 None。 (值 Restricted 有效,但行為與 None 相同。) |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 OnDelete 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Association 元素定義了 FK_CustomerOrders 外部索引鍵條件約束。 OnDelete 元素表示,如果 Customers 資料表中的列遭刪除,則在 Customers 資料表參照特定列的 Orders 資料表所有列都會遭刪除。
<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 (零或一個)
- Annotation 元素 (零或多個)
適用屬性
下表說明可套用至 Parameter 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 參數名稱。 |
類型 | Yes | 參數型別。 |
模式 | No | In、Out 或 InOut 需視參數是輸入、輸出或輸入/輸出參數而定。 |
MaxLength | No | 參數的長度上限。 |
有效位數 | No | 參數的精確度。 |
縮放比例 | No | 參數的小數位數。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的參數有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Parameter 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Function 元素具有兩個指定輸入參數的 Parameter 元素:
<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 (一或多個)
- Annotation 元素 (零或多個)
適用屬性
下表說明可套用至 Principal 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Role | Yes | 與對應的 End 元素的 Role 屬性相同的值,否則,就是包含參照欄的資料表名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Principal 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為 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 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 對應資料行的名稱。 |
類型 | Yes | 對應資料行的類型。 |
可為 Null | No | True (預設值) 或 False 需視對應的欄是否可以有 Null 值而定。 |
DefaultValue | No | 對應資料行的預設值。 |
MaxLength | No | 對應資料行的長度上限。 |
FixedLength | No | True 或 False 需視對應欄的值是否儲存為固定長度的字串而定。 |
有效位數 | No | 對應資料行的精確度。 |
縮放比例 | No | 對應資料行的小數位數。 |
Unicode | No | True 或 False 需視對應欄的值是否儲存為 Unicode 字串而定。 |
定序 | No | 指定資料來源中使用之定序順序的字串。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的屬性有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 |
StoreGeneratedPattern | No | None、Identity (如果對應的欄值是在資料庫產生的身分識別),或 Computed (如果對應的欄值是在資料庫中計算)。 對於 RowType 屬性無效。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Property 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有兩個 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 (零或一個)
- Annotation 項目
適用屬性
下表說明可套用至 PropertyRef 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 參考屬性的名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 PropertyRef 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 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 (正好一個)
- Annotation 元素 (零或多個)
適用屬性
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 ReferentialConstraint 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為 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 屬性來指定函式傳回類型。
函式的傳回類型是以 ReturnType 元素的 Type 屬性指定。
ReturnType 元素可以有以下子元素:
- CollectionType (一個)
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 ReturnType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留供 SSDL 使用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例使用的 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
的 XML 命名空間 (其中 YYYY 和 MM 分別代表年和月) 會保留給 SSDL。 自訂項目和屬性不能出現在擁有此格式的命名空間中。
適用屬性
下表說明可套用至 Schema 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Namespace | Yes | 儲存模型的命名空間。 Namespace 屬性的值會用來構成類型的完整合格名稱。 舉例來說,如果名為 Customer 的 EntityType 位於 ExampleModel.Store 命名空間,EntityType 的完整合格名稱就是 ExampleModel.Store.Customer。 下列字串無法設為 Namespace 屬性的值:System、Transient或 Edm。 Namespace 屬性的值不能與 CSDL 結構描述元素的 Namespace 屬性值相同。 |
別名 | No | 用來取代命名空間名稱的識別項。 舉例來說,如果名為 Customer 的 EntityType 位於 ExampleModel.Store 命名空間,且 Alias 屬性的值是 StorageModel,您可以將 StorageModel.Customer 當作 EntityType 的完整合格名稱。 |
提供者 | Yes | 資料提供者。 |
ProviderManifestToken | Yes | 向提供者表示要傳回哪個提供者資訊清單的語彙基元。 未定義此語彙基元的格式。 語彙基元的值是由提供者定義。 如需瞭解 SQL Server 提供者的資訊清單權杖,請參閱 Entity Framework 的 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>
註釋屬性
存放結構定義語言 (SSDL) 中的 Annotation 屬性是儲存體模型中的自訂 XML 屬性,它們可提供與儲存體模型中之項目相關的額外中繼資料。 除了擁有有效的 XML 結構外,下列條件約束適用於 Annotation 屬性:
- Annotation 屬性不能在任何 XML 命名空間之中,這是保留供 SSDL 之用。
- 任兩個 Annotation 屬性的完整名稱不能相同。
可以將一個以上的 Annotation 屬性套用至指定的 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>
Annotation 項目 (SSDL)
存放結構定義語言 (SSDL) 中的 Annotation 項目是儲存體模型中的自訂 XML 項目,它們可提供與儲存體模型相關的額外中繼資料。 除了擁有有效的 XML 結構外,下列條件約束適用於 Annotation 項目:
- Annotation 項目不能存在於保留供 SSDL 使用的任何 XML 命名空間中。
- 任兩個 Annotation 項目的完整名稱不能相同。
- Annotation 項目必須出現在所指定 SSDL 項目的所有其他子項目之後。
多個 Annotation 項目可以同時做為所指定 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>
Facet (SSDL)
存放區結構描述定義語言 (SSDL) 的 Facets 代表在 Property 元素所指定的欄類型所設的條件約束。 Facets 會在 Property 元素上以 XML 屬性的形式來實作。
下表說明 SSDL 中支援的 Facet:
Facet | 描述 |
---|---|
定序 | 在執行比較和排序屬性值的作業時,指定要使用的定序順序 (或排序順序)。 |
FixedLength | 指定資料行值的長度是否可以變更。 |
MaxLength | 指定資料行值的最大長度。 |
有效位數 | 如果是類型 Decimal 的屬性,請指定屬性值可以擁有的位數。 如果是類型 Time、DateTime 和 DateTimeOffset 的屬性,請指定欄值秒數小數點後的位數。 |
縮放比例 | 指定資料行值小數點右邊的位數。 |
Unicode | 指定資料行值是否儲存為 Unicode。 |