CSDL 規格
注意
CSDL v1 不受支援,請更新至 V3
概念結構定義語言 (CSDL) 是 XML架構語言,可描述組成資料驅動應用程式之概念模型的實體、關聯性和函式。 Entity Framework 或 WCF 資料服務可以使用此概念模型。 Entity Framework 是使用以 CSDL 描述的中繼資料,將在概念模型定義的實體和關聯對應到資料來源。 如需更多資訊,請參閱 SSDL 規格和 MSL 規格。
CSDL 是實體資料模型的 Entity Framework 實作。
在 Entity Framework 應用程式中,概念模型中繼資料會從 .csdl 檔案 (以 CSDL 撰寫) 載入 System.Data.Metadata.Edm.EdmItemCollection 的執行個體,且可以使用 System.Data.Metadata.Edm.MetadataWorkspace 類別的方法來存取。 Entity Framework 會使用概念模型中繼資料,將針對概念模型的查詢轉譯為資料來源專用的命令。
EF Designer 會在設計階段將概念模型資訊儲存在 .edmx 檔案。 在建置階段,EF Designer 會使用 .edmx 檔案中的資訊,建立 Entity Framework 在執行階段所需的 .csdl 檔案。
CSDL 的版本可藉由 XML 命名空間來區別。
CSDL 版本 | XML 命名空間 |
---|---|
CSDL v1 | https://schemas.microsoft.com/ado/2006/04/edm |
CSDL v2 | https://schemas.microsoft.com/ado/2008/09/edm |
CSDL v3 | https://schemas.microsoft.com/ado/2009/11/edm |
Association 項目 (CSDL)
Association 元素定義了兩個實體類型之間的關聯性。 關聯 (Association) 必須指定關聯性 (relationship) 中的相關實體類型,以及關聯性每一端可能的實體類型數量 (也就是「多重性」)。 關聯 End 的多重性值可以是一 (0)、零或一 (0..1),或許多 (*)。 這項資訊是以兩個子 End 元素指定。
關聯其中一端的實體類型執行個體可透過導覽屬性或外部索引鍵來存取 (若在實體類型上公開)。
在應用程式中,關聯的執行個體代表實體類型之間的特定關聯。 關聯執行個體會在邏輯上群組於關聯集。
Association 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- End (正好 2 個元素)
- ReferentialConstraint (零或一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 Association 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 關聯的名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Association 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Association 元素定義了外部索引鍵還未向 Customer 和 Order 實體類型公開時的 CustomerOrders 關聯。 關聯的每個 End 的多重性值指出許多 Orders 可以與一個 Customer 建立關聯,但只有一個 Customer 可以與 Order 建立關聯。 此外,OnDelete 元素指出如果 Customer 已刪除,則所有與特定 Customer 相關且已載入 ObjectContext 的 Orders 都會遭到刪除。
<Association Name="CustomerOrders">
<End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" >
<OnDelete Action="Cascade" />
</End>
<End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
</Association>
下列範例所示的 Association 元素定義了外部索引鍵已向 Customer 和 Order 實體類型公開時的 CustomerOrders 關聯。 公開外部索引鍵後,實體之間的關聯性是以 ReferentialConstraint 元素來管理。 將此關聯對應至資料來源時,對應的 AssociationSetMapping 元素並非必要。
<Association Name="CustomerOrders">
<End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" >
<OnDelete Action="Cascade" />
</End>
<End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Customer">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="Order">
<PropertyRef Name="CustomerId" />
</Dependent>
</ReferentialConstraint>
</Association>
AssociationSet 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 AssociationSet 元素是相同類型的關聯執行個體的邏輯容器。 關聯集提供群組關聯執行個體的定義,執行個體才能對應至資料來源。
AssociationSet 元素可以擁有下列子元素 (依列出的順序):
- Documentation (允許零或一個元素)
- End (正好需要兩個元素)
- Annotation 元素 (允許零或一個元素)
Association 屬性會指定關聯集所包含的關聯類型。 組成關聯集結尾的實體集是以正好兩個子 End 元素所指定。
適用屬性
下表說明可套用至 AssociationSet 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體集的名稱。 Name 屬性的值不能與 Association 屬性的值相同。 |
關聯 | Yes | 關聯執行個體 (由關聯集包含) 之關聯的完整名稱。 關聯必須存在與關聯集相同的命名空間中。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 AssociationSet 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例顯示具有兩個 AssociationSet 元素的 EntityContainer 元素:
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
CollectionType 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 CollectionType 元素會指定函式參數或函式傳回類型為集合。 CollectionType 元素可以是 Parameter 元素或 ReturnType (Function) 元素的子系。 您可以使用 Type 屬性或下列其中一個子元素來指定集合類型:
- CollectionType
- ReferenceType
- RowType
- TypeRef
注意
如果集合的類型同時以 Type 屬性和子元素來指定,模型就無法驗證。
適用屬性
下表說明可套用至 CollectionType 元素的屬性。 請注意,DefaultValue、MaxLength、FixedLength、Precision、Scale、Unicode 和 Collation 屬性僅適用於 EDMSimpleTypes 集合。
屬性名稱 | 是必要的 | 值 |
---|---|---|
類型 | No | 集合的型別。 |
可為 Null | No | True (預設值) 或 False 需視屬性是否可以有 Null 值而定。 [!注意] |
> 在 CSDL v1,複雜類型的屬性必須有 Nullable="False" 。 |
||
DefaultValue | No | 屬性的預設值。 |
MaxLength | No | 屬性值的最大長度。 |
FixedLength | No | True 或 False 需視屬性值是否儲存為固定長度的字串而定。 |
有效位數 | No | 屬性值的有效位數。 |
縮放比例 | No | 屬性值的小數位數。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的屬性有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server) |
Unicode | No | True 或 False 需視屬性值是否儲存為 Unicode 字串而定。 |
定序 | No | 指定資料來源中使用之定序順序的字串。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 CollectionType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的模型定義函式使用 CollectionType 元素來指定函式傳回 Person 實體類型的集合 (如 ElementType 屬性所指定)。
<Function Name="LastNamesAfter">
<Parameter Name="someString" Type="Edm.String"/>
<ReturnType>
<CollectionType ElementType="SchoolModel.Person"/>
</ReturnType>
<DefiningExpression>
SELECT VALUE p
FROM SchoolEntities.People AS p
WHERE p.LastName >= someString
</DefiningExpression>
</Function>
下列範例所示的模型定義函式使用 CollectionType 元素來指定函式傳回列集合 (如 RowType 元素所指定)。
<Function Name="LastNamesAfter">
<Parameter Name="someString" Type="Edm.String" />
<ReturnType>
<CollectionType>
<RowType>
<Property Name="FirstName" Type="Edm.String" Nullable="false" />
<Property Name="LastName" Type="Edm.String" Nullable="false" />
</RowType>
</CollectionType>
</ReturnType>
<DefiningExpression>
SELECT VALUE ROW(p.FirstName, p.LastName)
FROM SchoolEntities.People AS p
WHERE p.LastName >= somestring
</DefiningExpression>
</Function>
下列範例所示的模型定義函式使用 CollectionType 元素來指定函式將 Department 實體類型的集合接受為參數。
<Function Name="GetAvgBudget">
<Parameter Name="Departments">
<CollectionType>
<TypeRef Type="SchoolModel.Department"/>
</CollectionType>
</Parameter>
<ReturnType Type="Collection(Edm.Decimal)"/>
<DefiningExpression>
SELECT VALUE AVG(d.Budget) FROM Departments AS d
</DefiningExpression>
</Function>
ComplexType 項目 (CSDL)
ComplexType 元素定義了資料結構由 EdmSimpleType 屬性或其他複雜類型所組成。 複雜類型可以是實體類型的屬性或其他複雜類型的屬性。 複雜類型與實體類型相似之處在於複雜類型會定義資料。 不過,複雜型別和實體類型之間還是有些重大的差異:
- 複雜型別不具有識別 (或索引鍵),因此無法獨立存在。 複雜型別只能以實體類型或其他複雜型別的屬性形式存在。
- 複雜類型不可參與關聯。 關聯的兩端都不能是複雜類型,因此複雜類型不能定義導覽屬性。
- 雖然複雜型別的純量屬性可能每個都設為 null,但複雜型別屬性不可以有 null 值。
ComplexType 可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Property (零或多個元素)
- Annotation 元素 (零或一個元素)
下表說明可套用至 ComplexType 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 複雜類型的名稱。 複雜類型的名稱不可與其他複雜類型、實體類型或模型範圍內之關聯的名稱相同。 |
BaseType | No | 其他複雜類型的名稱是即將定義之複雜類型的基底型別。 [!注意] |
> 此屬性不適用於 CSDL v1。 該版本不支援複雜類型的繼承。 | ||
摘要 | No | True 或 False (預設值) 需視複雜類型是否為抽象類型而定。 [!注意] |
> 此屬性不適用於 CSDL v1。 該版本的複雜類型不可以是抽象型別。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 ComplexType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為複雜類型 Address,其中包含 EdmSimpleType 屬性 StreetAddress、City、StateOrProvince、Country 和 PostalCode。
<ComplexType Name="Address" >
<Property Type="String" Name="StreetAddress" Nullable="false" />
<Property Type="String" Name="City" Nullable="false" />
<Property Type="String" Name="StateOrProvince" Nullable="false" />
<Property Type="String" Name="Country" Nullable="false" />
<Property Type="String" Name="PostalCode" Nullable="false" />
</ComplexType>
若要將上方的複雜類型 Address 定義為實體類型的屬性,您必須在實體類型定義中宣告屬性類型。 以下範例所示的 Address 屬性是實體類型的複雜類型 (Publisher):
<EntityType Name="Publisher">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="BooksModel.Address" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
FromRole="Publisher" ToRole="Book" />
</EntityType>
DefiningExpression 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 DefiningExpression元素包含的 Entity SQL 運算式定義了概念模型的函式。
注意
基於驗證目的,DefiningExpression 元素可以包含任意內容。 不過,如果 DefiningExpression 元素不包含有效的 Entity SQL,Entity Framework 會在執行階段擲回例外狀況。
適用屬性
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 DefiningExpression 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例使用 DefiningExpression 元素將函式定義為傳回書籍發行至今的年數。 DefiningExpression 元素的內容是以 Entity SQL 撰寫。
<Function Name="GetYearsInPrint" ReturnType="Edm.Int32" >
<Parameter Name="book" Type="BooksModel.Book" />
<DefiningExpression>
Year(CurrentDateTime()) - Year(cast(book.PublishedDate as DateTime))
</DefiningExpression>
</Function>
Dependent 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 Dependent 元素是 ReferentialConstraint 元素的子元素,定義了參考條件約束的相依端。 ReferentialConstraint 元素定義的功能類似關聯式資料庫中的參考完整性條件約束。 同樣地,資料庫資料表的資料行 (或多個資料行) 可以參考其他資料表的主索引鍵,實體類型的屬性 (或多個屬性) 可以參考其他實體類型的實體索引鍵。 參考的實體類型稱為限制式的「主要端點」。 參考主要端點的實體類型稱為限制式的「相依端點」。 PropertyRef 元素可用來指定參照主要端點的索引鍵為何。
Dependent 元素可以擁有下列子元素 (依列出的順序):
- PropertyRef (一或多個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 Dependent 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Role | Yes | 位於關聯之相依端點的實體類型名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Dependent 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為 ReferentialConstraint 元素使用在 PublishedBy 關聯的定義當中。 Book 實體類型的 PublisherId 屬性組成了參考條件約束的相依端點。
<Association Name="PublishedBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
</End>
<End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
<ReferentialConstraint>
<Principal Role="Publisher">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="Book">
<PropertyRef Name="PublisherId" />
</Dependent>
</ReferentialConstraint>
</Association>
Documentation 項目 (CSDL)
概念結構描述定義語言的 Documentation 元素可用來提供在父系元素定義的物件相關資訊。 在 .edmx 檔案中,如果 Documentation 元素是在 EF Designer 設計介面上顯示為物件的元素的子系 (例如實體、關聯或屬性),Documentation 元素的內容會顯示在物件的 Visual Studio 屬性 視窗中。
Documentation 元素可以擁有下列子元素 (依列出的順序):
- Summary:父系元素簡短說明。 (零或一個項目)
- LongDescription:父系元素的廣泛說明。 (零或一個項目)
- Annotation 元素。 (零或多個項目)
適用屬性
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Documentation 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Documentation 元素是 EntityType 元素的子元素。 如果下列程式碼片段位在某個 .edmx 檔案的 CSDL 內容中,在您按一下 Customer
實體類型後,Summary 和 LongDescription 元素的內容就會顯示在 Visual Studio 屬性的視窗中。
<EntityType Name="Customer">
<Documentation>
<Summary>Summary here.</Summary>
<LongDescription>Long description here.</LongDescription>
</Documentation>
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Type="Int32" Name="CustomerId" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false" />
</EntityType>
End 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 End 元素可以是 Association 元素或 AssociationSet 元素的子系。 在每個案例中 ,End 元素的角色都不同,適用的屬性也不同。
End 項目為 Association 項目的子項目
End 元素 (如果是 Association 元素的子元素) 會識別關聯一端的實體類型,以及在關聯的該端點可存在的實體類型執行個體數量。 關聯 End 會定義為關聯的部分。關聯必須具有兩個關聯 End。 關聯其中一端的實體類型執行個體可透過導覽屬性或外部索引鍵來存取 (若在實體類型上公開)。
End 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- OnDelete (零或一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明當 End 元素是 Association 元素的子系時,可套用至該元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
類型 | Yes | 其中一個關聯 End 的實體類型名稱。 |
Role | No | 關聯 End 的名稱。 如果未提供任何名稱,則會使用關聯 End 上之實體類型的名稱。 |
多重性 | Yes | 1、0..1 或 * 需視可放在在關聯結尾的實體類型執行個體數量而定。 1 表示關聯的結尾存在正好一個實體類型執行個體。 0..1 表示關聯結尾存在零個或一個實體類型執行個體。 * 表示關聯結尾存在零、一或多個實體類型執行個體。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 End 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Association 元素定義了 CustomerOrders 的關聯。 關聯的每個 End 的多重性值指出許多 Orders 可以與一個 Customer 建立關聯,但只有一個 Customer 可以與 Order 建立關聯。 此外,OnDelete 元素指出如果 Customer 已刪除,則所有與特定 Customer 相關且已載入 ObjectContext 的 Orders 都會遭刪除。
<Association Name="CustomerOrders">
<End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1" />
<End Type="ExampleModel.Order" Role="Order" Multiplicity="*">
<OnDelete Action="Cascade" />
</End>
</Association>
End 項目為 AssociationSet 項目的子項目
End 元素指定了關聯集的一端。 AssociationSet 元素必須包含兩個 End 元素。 End 元素包含的資訊係用於將關聯集對應至資料來源。
End 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Annotation 元素 (零或一個元素)
注意
Annotation 項目必須出現在所有其他子項目之後。 Annotation 元素只能在 CSDL v2 和之後的版本使用。
適用屬性
下表說明當 End 元素是 AssociationSet 元素的子系時,可套用至該元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
EntitySet | Yes | 定義了父系 AssociationSet 元素一端的 EntitySet 元素的名稱。 EntitySet 元素必須在與父系的 AssociationSet 元素的相同實體容器中定義。 |
Role | No | 關聯集 End 的名稱。 如果未使用 Role 屬性,關聯集結尾的名稱會是實體集的名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 End 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有兩個 AssociationSet 元素的 EntityContainer 元素,這兩個元素都有兩個 End 元素:
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
EntityContainer 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 EntityContainer 元素是實體集、關聯集和函式匯入的邏輯容器。 概念模型實體容器會透過 EntityContainerMapping 元素對應至儲存體模型實體容器。 儲存體模型實體容器描述資料的結構:實體集描述資料表、關聯集描述外部索引建條件約束,而函式匯入則描述資料庫中的預存程序。
EntityContainer 元素可有零或一個 Documentation 元素。 如果 Documentation 元素存在,它必須位於所有 EntitySet、AssociationSet 和 FunctionImport 元素之前。
EntityContainer 元素可以有零或多個以下子元素 (依所列順序):
- EntitySet
- AssociationSet
- FunctionImport
- Annotation 項目
您可以擴充 EntityContainer 元素,讓它包含相同命名空間中另一個 EntityContainer 的內容。 若要包含其他 EntityContainer 的內容,請在參照的 EntityContainer 元素中,將 Extends 屬性的值設為您想要包含的 EntityContainer 元素的名稱。 系統會將包含的 EntityContainer 元素的所有子元素視為參照的 EntityContainer 元素的子元素。
適用屬性
下表說明可套用至 Using 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體容器的名稱。 |
Extends | No | 相同命名空間中另一個實體容器的名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 EntityContainer 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 EntityContainer 元素定義了三個實體集和兩個關聯集。
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
EntitySet 項目 (CSDL)
概念結構描述定義語言的 EntitySet 元素是實體類型執行個體及從該實體類型衍生的任何類型執行個體的邏輯容器。 實體類型和實體集之間的關聯性,類似於關聯式資料庫中資料列與資料表的關係。 實體類型和資料列一樣可以定義相關的資料集,而實體集則和資料表一樣可以包含該定義的執行個體。 實體集提供群組實體類型執行個體的建構,以便將它們對應至資料來源中的相關資料結構。
您可以為特定的實體類型定義多個實體集。
注意
EF Designer 不支援每個類型包含多個實體集的概念模型。
EntitySet 元素可以擁有下列子元素 (依列出的順序):
- Documentation 元素 (允許零或一個元素)
- Annotation 元素 (允許零或一個元素)
適用屬性
下表說明可套用至 EntitySet 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體集的名稱。 |
EntityType | Yes | 實體類型 (實體集包含其執行個體) 的完整名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 EntitySet 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有三個 EntitySet 元素的 EntityContainer 元素:
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
您可以定義每個類型的多重實體集 (MEST)。 下列範例所定義的實體容器具有兩個 Book 實體類型的實體集:
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="FictionBooks" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="BookAuthor" Association="BooksModel.BookAuthor">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
EntityType 項目 (CSDL)
在概念模型中,EntityType 元素代表最上層概念的結構,例如客戶或訂單。 實體類型是應用程式中實體類型之執行個體的範本。 每個範本包含下列資訊:
- 唯一名稱。 (必要項。)
- 實體索引鍵是由一個或多個屬性定義。 (必要項。)
- 包含資料的屬性。 (選用。)
- 導覽屬性允許從關聯的一端瀏覽至另一端。 (選用。)
在應用程式中,實體類型的執行個體代表特定的物件 (例如特定的客戶或訂單)。 實體類型的每一個執行個體都必須在實體集有唯一的實體索引鍵。
如果兩個實體類型執行個體屬於相同類型,而且索引鍵的值也相同,則會將這兩個執行個體視為相等。
EntityType 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Key (零或一個元素)
- Property (零或多個元素)
- NavigationProperty (零個或多個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 EntityType 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體類型的名稱。 |
BaseType | No | 其他實體類型的名稱是即將定義之實體類型的基底類型。 |
摘要 | No | True 或 False 需視實體類型是否為抽象類型而定。 |
OpenType | No | True 或 False 需視實體類型是否為開放實體類型而定。 [!注意] |
>OpenType 屬性所適用的實體類型必須是在與 ADO.NET Data Services 搭配使用的概念模型中定義。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 EntityType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有三個 Property 元素和兩個 NavigationProperty 元素的 EntityType 元素:
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
EnumType 元素 (CSDL)
EnumType 元素代表列舉類型。
EnumType 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Member (零或多個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 EnumType 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 實體類型的名稱。 |
IsFlags | No | True 或 False 需視列舉類型是否可當做一組標幟使用而定。 預設值為 False。 |
UnderlyingType | No | Edm.Byte、Edm.Int16、Edm.Int32、Edm.Int64 或 Edm.SByte 定義類型的值範圍。 預設基礎列舉項目類型是 Edm.Int32.。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 EnumType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有三個 Member 元素的 EnumType 元素:
<EnumType Name="Color" IsFlags=”false” UnderlyingTyp=”Edm.Byte”>
<Member Name="Red" />
<Member Name="Green" />
<Member Name="Blue" />
</EntityType>
Function 屬性 (CSDL)
概念結構描述定義語言的 Function 元素係用於定義或宣告概念模型的函式。 函式需使用 DefiningExpression 元素來定義。
Function 可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Parameter (零或多個元素)
- DefiningExpression (零或一個元素)
- ReturnType (Function) (零或一個元素)
- Annotation 元素 (零或一個元素)
函式的傳回類型必須以 ReturnType (Function) 元素或 ReturnType 屬性來指定 (請參閱下方),但不能同時指定兩者。 可能的傳回型別包括任何 EdmSimpleType、實體類型、複雜類型、資料列型別或 ref 型別 (或這些類型其中之一的集合)。
適用屬性
下表說明可套用至 Function 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 函數的名稱。 |
ReturnType | No | 此函式傳回的型別。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Function 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例使用 Function 元素來定義函式,讓它傳回講師雇用至今的年數。
<Function Name="YearsSince" ReturnType="Edm.Int32">
<Parameter Name="date" Type="Edm.DateTime" />
<DefiningExpression>
Year(CurrentDateTime()) - Year(date)
</DefiningExpression>
</Function>
FunctionImport 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 FunctionImport 元素所代表的函式是在資料來源所定義,但可透過概念模型提供物件使用。 舉例來說,儲存體模型中的 Function 元素可用於代表資料庫中的預存程序。 概念模型中的 FunctionImport 元素代表 Entity Framework 應用程式中的對應函式,並藉由使用 FunctionImportMapping 元素來對應儲存體模型函式。 在應用程式中呼叫函式時,對應的預存程序會在資料庫中執行。
FunctionImport 元素可以擁有下列子元素 (依列出的順序):
- Documentation (允許零或一個元素)
- Parameter (允許零個或多個元素)
- Annotation 元素 (允許零或一個元素)
- ReturnType (FunctionImport) (允許零個或多個元素)
每個參數都應定義一個函式可接受的 Parameter 元素。
函式的傳回類型必須以 ReturnType (FunctionImport) 元素或 ReturnType 屬性來指定 (請參閱下方),但不能同時指定兩者。 傳回類型值必須是 EdmSimpleType、EntityType 或 ComplexType 的集合。
適用屬性
下表說明可套用至 FunctionImport 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 匯入函式的名稱。 |
ReturnType | No | 函式傳回的型別。 如果函式不會傳回值,請不要使用這個屬性。 否則,值必須是 ComplexType、EntityType 或 EDMSimpleType 的集合。 |
EntitySet | No | 如果函式傳回實體類型的集合,EntitySet 的值必須是集合所屬的實體集。 否則,EntitySet 屬性不得使用。 |
IsComposable | No | 如果值設為 true,則函式可組合 (取用資料表值的函式),且可用於 LINQ 查詢。 預設值為 false。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 FunctionImport 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 FunctionImport 可接受一個參數並傳回實體類型集合:
<FunctionImport Name="GetStudentGrades"
EntitySet="StudentGrade"
ReturnType="Collection(SchoolModel.StudentGrade)">
<Parameter Name="StudentID" Mode="In" Type="Int32" />
</FunctionImport>
Key 項目 (CSDL)
Key 元素是 EntityType 元素的子元素,且定義了實體索引鍵 (決定身分識別的實體類型屬性或屬性集)。 構成實體索引鍵的屬性是在設計階段選取的。 實體索引鍵屬性的值必須在執行階段的實體集中,單獨識別實體類型執行個體。 您應選取構成實體索引鍵的屬性,以保證執行個體在實體集中的唯一性。 Key 元素藉由參照實體類型的一或多個屬性來定義實體索引鍵。
Key 元素可以有以下子元素:
- PropertyRef (一或多個元素)
- Annotation 元素 (零或一個元素)
適用屬性
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Key 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例定義的實體類型名為 Book。 實體索引鍵是藉由參照實體類型的 ISBN 屬性來定義。
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
ISBN 屬性是實體索引鍵的好選擇,因為國際標準書號 (International Standard Book Number,ISBN) 可明確識別一本書。
下列範例所示的實體類型 (Author) 包含的實體索引鍵由 Name 和 Address 兩個屬性組成。
<EntityType Name="Author">
<Key>
<PropertyRef Name="Name" />
<PropertyRef Name="Address" />
</Key>
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
FromRole="Author" ToRole="Book" />
</EntityType>
在實體索引鍵中使用 Name 和 Address 是合理的選擇,因為相同姓名的兩位作者不太可能住在同一個地址。 不過,針對實體索引鍵所做的這個選擇不能絕對保證實體集中的唯一實體索引鍵。 在這種情況下,建議您加入一個屬性,例如 AuthorId,可用於明確識別作者。
Member 元素 (CSDL)
Member 元素是 EnumType 元素的子元素,定義了列舉類型的成員。
適用屬性
下表說明可套用至 FunctionImport 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 成員的名稱。 |
ReplTest1 | No | 成員的值。 根據預設,第一個成員的值是 0,而每個後續列舉程式的值會遞增 1。 多個具有相同值的成員可能存在。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 FunctionImport 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有三個 Member 元素的 EnumType 元素:
<EnumType Name="Color">
<Member Name="Red" Value=”1”/>
<Member Name="Green" Value=”3” />
<Member Name="Blue" Value=”5”/>
</EntityType>
NavigationProperty 項目 (CSDL)
NavigationProperty 元素定義了導覽屬性,可提供參照關聯的另一端。 與使用 Property 元素來定義的屬性不同,導覽屬性不會定義資料的型態和特性。 他們提供巡覽兩個實體類型間之關聯的方式。
請注意,在關聯各端點的實體類型上,導覽屬性是選擇性的。 如果您在關聯其中一個端點的實體類型上定義導覽屬性,就不必在關聯另一個端點的實體類型上定義導覽屬性。
導覽屬性傳回的資料類型是由其遠端關聯端點的多重性所判斷。 舉例來說,假設 Customer 實體類型中有一個導覽屬性 OrdersNavProp,它會在 Customer 和 Order 之間導覽一對多的關聯。 由於導覽屬性的遠端關聯端具有多重性 many (*),因此其資料類型是 (Order 的) 集合。 同樣地,如果 Order 實體類型中有一個導覽屬性 CustomerNavProp,其資料類型會是 Customer,因為遠端的多重性是一 (1)。
NavigationProperty 可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 NavigationProperty 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 導覽屬性的名稱。 |
關聯 | Yes | 關聯的名稱在模型的範圍之內。 |
ToRole | Yes | 位於導覽端點的關聯端點。 ToRole 屬性的值必須與其中一個在關聯端之一定義的 Role 屬性的值相同 (定義於 AssociationEnd 元素)。 |
FromRole | Yes | 開始導覽的關聯端點。 FromRole 屬性的值必須與其中一個在關聯端之一定義的 Role 屬性的值相同 (定義於 AssociationEnd 元素)。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 NavigationProperty 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例定義的實體類型 (Book) 具有兩個導覽屬性 (PublishedBy 和 WrittenBy):
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
OnDelete 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 OnDelete 元素定義了與關聯連結的行為。 如果 Action 屬性設為關聯一端的 Cascade,當第一端的實體類型遭刪除時,另一端的相關實體類型也會遭到刪除。 如果兩個實體類型之間的關聯是主索引鍵對主索引鍵的關係,則不論 OnDelete 規格為何,當關聯的另一端的主體物件遭到刪除,載入的相依物件也會遭到刪除。
注意
OnDelete 元素只會影響應用程式的執行階段行為,不會影響資料來源的行為。 資料來源中定義的行為應與應用程式中定義的行為相同。
OnDelete 元素可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 OnDelete 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
動作 | Yes | Cascade 或 None。 如果是 Cascade,刪除主體實體類型也會刪除相依實體類型。 如果是 None,刪除主體實體類型不會刪除相依實體類型。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Association 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Association 元素定義了 CustomerOrders 的關聯。 OnDelete 元素指出,如果 Customer 已刪除,則所有與特定 Customer 相關且已載入 ObjectContext 的 Orders 都會遭到刪除。
<Association Name="CustomerOrders">
<End Type="ExampleModel.Customer" Role="Customer" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Type="ExampleModel.Order" Role="Order" Multiplicity="*" />
</Association>
Parameter 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 Parameter 元素可以是 FunctionImport 元素或 Function 元素的子系。
FunctionImport 項目的應用
Parameter 元素 (如果是 FunctionImport 元素的子系) 可用於為在 CSDL 宣告的函式匯入定義輸入和輸出參數。
Parameter 元素可以擁有下列子項目 (依列出的順序):
- Documentation (允許零或一個元素)
- Annotation 元素 (允許零或一個元素)
適用屬性
下表說明可套用至 Parameter 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 參數名稱。 |
類型 | Yes | 參數型別。 此值在模型範圍內必須是 EDMSimpleType 或複雜類型。 |
模式 | No | In、Out 或 InOut 需視參數是輸入、輸出或輸入/輸出參數而定。 |
MaxLength | No | 可允許的最大參數長度。 |
有效位數 | No | 參數的精確度。 |
縮放比例 | No | 參數的小數位數。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的參數有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Parameter 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有一個Parameter子元素的 FunctionImport 元素。 函式接受一個輸入參數,然後傳回實體類型的集合。
<FunctionImport Name="GetStudentGrades"
EntitySet="StudentGrade"
ReturnType="Collection(SchoolModel.StudentGrade)">
<Parameter Name="StudentID" Mode="In" Type="Int32" />
</FunctionImport>
Function 項目的應用
Parameter 元素 (如果是 Function 元素的子系) 定義了在概念模型中定義或宣告的函式的參數。
Parameter 元素可以擁有下列子項目 (依列出的順序):
- Documentation (零或一個元素)
- CollectionType (零或一個元素)
- ReferenceType (零或一個元素)
- RowType (零或一個元素)
注意
CollectionType、ReferenceType 或 RowType 元素當中只有一個可以是 Property 元素的子元素。
- Annotation 元素 (允許零或一個元素)
注意
Annotation 項目必須出現在所有其他子項目之後。 Annotation 元素只能在 CSDL v2 和之後的版本使用。
適用屬性
下表說明可套用至 Parameter 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 參數名稱。 |
類型 | No | 參數型別。 參數可以是下列任何一種類型 (或這些類型的集合): EdmSimpleType 實體類型 複雜類型 列類型 參考類型 |
可為 Null | No | True (預設值) 或 False 需視屬性是否可以有 Null 值而定。 |
DefaultValue | No | 屬性的預設值。 |
MaxLength | No | 屬性值的最大長度。 |
FixedLength | No | True 或 False 需視屬性值是否儲存為固定長度的字串而定。 |
有效位數 | No | 屬性值的有效位數。 |
縮放比例 | No | 屬性值的小數位數。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的屬性有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 |
Unicode | No | True 或 False 需視屬性值是否儲存為 Unicode 字串而定。 |
定序 | No | 指定資料來源中使用之定序順序的字串。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Parameter 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Function 元素使用一個 Parameter 子元素來定義函式參數。
<Function Name="GetYearsEmployed" ReturnType="Edm.Int32">
<Parameter Name="Instructor" Type="SchoolModel.Person" />
<DefiningExpression>
Year(CurrentDateTime()) - Year(cast(Instructor.HireDate as DateTime))
</DefiningExpression>
</Function>
Principal 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 Principal 元素是 ReferentialConstraint 元素的子元素,定義了參考條件約束的主體端。 ReferentialConstraint 元素定義的功能類似關聯式資料庫中的參考完整性條件約束。 同樣地,資料庫資料表的資料行 (或多個資料行) 可以參考其他資料表的主索引鍵,實體類型的屬性 (或多個屬性) 可以參考其他實體類型的實體索引鍵。 參考的實體類型稱為限制式的「主要端點」。 參考主要端點的實體類型稱為限制式的「相依端點」。 PropertyRef 元素可用來指定相依端所參照的索引鍵。
Principal 元素可以擁有下列子元素 (依列出的順序):
- PropertyRef (一或多個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 Principal 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Role | Yes | 位於關聯之主要端點的實體類型名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Principal 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 ReferentialConstraint 元素是 PublishedBy 關聯定義的一部分。 Publisher 實體類型的 Id 屬性構成參考條件約束的主體端。
<Association Name="PublishedBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
</End>
<End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
<ReferentialConstraint>
<Principal Role="Publisher">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="Book">
<PropertyRef Name="PublisherId" />
</Dependent>
</ReferentialConstraint>
</Association>
Property 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 Property 元素可以是 EntityType 元素、ComplexType 元素或 RowType 元素的子系。
EntityType 和 ComplexType 項目的應用程式
Property 元素 (如果是 EntityType 或 ComplexType 元素的子系) 定義了實體類型執行個體或複雜類型執行個體將包含的資料的型態和特性。 概念模型中的屬性類似類別中定義的屬性。 如同類別上的屬性可定義類別的圖形並包含關於物件的資訊,概念模型的屬性可定義實體類別的圖形,並包含關於實體類型執行個體的資訊。
Property 元素可以擁有下列子元素 (依列出的順序):
- Documentation 元素 (允許零或一個元素)
- Annotation 元素 (允許零或一個元素)
下列 Facet 可以套用至 Property 元素:Nullable、DefaultValue、MaxLength、FixedLength、Precision、Scale、Unicode、Collation、ConcurrencyMode。 Facet 是 XML 屬性 (attribute),提供關於屬性 (property) 值如何儲存在資料存放區資訊。
注意
Facet 只能套用至 EDMSimpleType 類型的屬性。
適用屬性
下表說明可套用至 Property 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 屬性的名稱。 |
類型 | Yes | 屬性值的型別。 屬性值類型在模型範圍內必須是 EDMSimpleType 或複雜類型 (以完全合格的名稱表示)。 |
可為 Null | No | True (預設值) 或 False 需視屬性是否可以有 Null 值而定。 [!注意] |
> 在 CSDL v1,複雜類型的屬性必須有 Nullable="False" 。 |
||
DefaultValue | No | 屬性的預設值。 |
MaxLength | No | 屬性值的最大長度。 |
FixedLength | No | True 或 False 需視屬性值是否儲存為固定長度的字串而定。 |
有效位數 | No | 屬性值的有效位數。 |
縮放比例 | No | 屬性值的小數位數。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的屬性有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 |
Unicode | No | True 或 False 需視屬性值是否儲存為 Unicode 字串而定。 |
定序 | No | 指定資料來源中使用之定序順序的字串。 |
ConcurrencyMode | No | None (預設值) 或 Fixed。 如果值設為 Fixed,則屬性值會使用在開放式並行存取檢查中。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Property 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為具有三個 Property 元素的 EntityType 元素:
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
下列範例所示為具有五個 Property 元素的 ComplexType 元素:
<ComplexType Name="Address" >
<Property Type="String" Name="StreetAddress" Nullable="false" />
<Property Type="String" Name="City" Nullable="false" />
<Property Type="String" Name="StateOrProvince" Nullable="false" />
<Property Type="String" Name="Country" Nullable="false" />
<Property Type="String" Name="PostalCode" Nullable="false" />
</ComplexType>
RowType 項目的應用程式
Property 元素 (如果是 RowType 元素的子系) 定義了可傳遞至模型定義函式或從模型定義函數傳回的資料的型態和特性。
Property 元素可以擁有下列正好一項子元素:
- CollectionType
- ReferenceType
- RowType
Property 元素可以有任意數量的子註釋元素。
注意
Annotation 元素只能在 CSDL v2 和之後的版本使用。
適用屬性
下表說明可套用至 Property 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 屬性的名稱。 |
類型 | Yes | 屬性值的型別。 |
可為 Null | No | True (預設值) 或 False 需視屬性是否可以有 Null 值而定。 [!注意] |
> 在 CSDL v1,複雜類型的屬性須有 Nullable="False" 。 |
||
DefaultValue | No | 屬性的預設值。 |
MaxLength | No | 屬性值的最大長度。 |
FixedLength | No | True 或 False 需視屬性值是否儲存為固定長度的字串而定。 |
有效位數 | No | 屬性值的有效位數。 |
縮放比例 | No | 屬性值的小數位數。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的屬性有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 |
Unicode | No | True 或 False 需視屬性值是否儲存為 Unicode 字串而定。 |
定序 | No | 指定資料來源中使用之定序順序的字串。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Property 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Property 元素用來定義模型定義函式傳回類型的型態。
<Function Name="LastNamesAfter">
<Parameter Name="someString" Type="Edm.String" />
<ReturnType>
<CollectionType>
<RowType>
<Property Name="FirstName" Type="Edm.String" Nullable="false" />
<Property Name="LastName" Type="Edm.String" Nullable="false" />
</RowType>
</CollectionType>
</ReturnType>
<DefiningExpression>
SELECT VALUE ROW(p.FirstName, p.LastName)
FROM SchoolEntities.People AS p
WHERE p.LastName >= somestring
</DefiningExpression>
</Function>
PropertyRef 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 PropertyRef 元素會參照實體類型的屬性,指出該屬性將執行下列其中一個角色:
- 實體索引鍵的一部分 (可判斷識別之實體類型的屬性或屬性集)。 有一或多個 PropertyRef 元素可用於定義實體索引鍵。
- 參考條件約束的相依端點和主要端點。
PropertyRef 元素的子元素只能有註釋元素 (零或多個)。
注意
Annotation 元素只能在 CSDL v2 和之後的版本使用。
適用屬性
下表說明可套用至 PropertyRef 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 參考屬性的名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 PropertyRef 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例定義了實體類型 (Book)。 實體索引鍵是藉由參照實體類型的 ISBN 屬性來定義。
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
下個範例使用兩個 PropertyRef 元素來指出兩個屬性 (Id 和 PublisherId) 是參考條件約束的主體和相依端。
<Association Name="PublishedBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
</End>
<End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
<ReferentialConstraint>
<Principal Role="Publisher">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="Book">
<PropertyRef Name="PublisherId" />
</Dependent>
</ReferentialConstraint>
</Association>
ReferenceType 項目 (CSDL)
概念結構描述定義語言 (CSDL) 中的 ReferenceType 元素會指定實體類型的參照。 ReferenceType 元素可以是以下元素的子系:
- ReturnType (Function)
- 參數
- CollectionType
定義函式的參數或傳回類型時,會使用 ReferenceType 元素。
ReferenceType 可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 ReferenceType 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
類型 | Yes | 參考之實體類型的名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 ReferenceType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 ReferenceType 元素在模型定義的函式中是 Parameter 元素的子系,它接受 Person 實體類型的參照:
<Function Name="GetYearsEmployed" ReturnType="Edm.Int32">
<Parameter Name="instructor">
<ReferenceType Type="SchoolModel.Person" />
</Parameter>
<DefiningExpression>
Year(CurrentDateTime()) - Year(cast(instructor.HireDate as DateTime))
</DefiningExpression>
</Function>
下列範例所示的 ReferenceType 元素在模型定義的函式中是 ReturnType (Function) 元素的子系,它會傳回 Person 實體類型的參照:
<Function Name="GetPersonReference">
<Parameter Name="p" Type="SchoolModel.Person" />
<ReturnType>
<ReferenceType Type="SchoolModel.Person" />
</ReturnType>
<DefiningExpression>
REF(p)
</DefiningExpression>
</Function>
ReferentialConstraint 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 ReferentialConstraint 元素定義的功能類似於關聯式資料庫的參考完整性條件約束。 同樣地,資料庫資料表的資料行 (或多個資料行) 可以參考其他資料表的主索引鍵,實體類型的屬性 (或多個屬性) 可以參考其他實體類型的實體索引鍵。 參考的實體類型稱為限制式的「主要端點」。 參考主要端點的實體類型稱為限制式的「相依端點」。
如果對一個實體類型公開的外部索引鍵參照另一個實體類型的屬性,ReferentialConstraint 元素會定義兩個實體類型之間的關聯。 由於 ReferentialConstraint 元素提供的資訊會說明這兩個實體類型的關聯方式,因此對應規格語言 (MSL) 不需要對應的 AssociationSetMapping 元素。 兩個未公開外部索引鍵的實體類型之間的關聯必須有對應的 AssociationSetMapping 元素,才能將關聯資訊對應至資料來源。
如果實體類型沒有公開外部索引鍵,ReferentialConstraint 元素只能定義實體類型與其他實體類型之間的主索引鍵對主索引鍵條件約束。
ReferentialConstraint 可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Principal (正好一個元素)
- Dependent (正好一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
ReferentialConstraint 元素可以有任意數目的註釋屬性 (自訂 XML 屬性)。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示為 ReferentialConstraint 元素使用在 PublishedBy 關聯的定義當中。
<Association Name="PublishedBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" >
</End>
<End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
<ReferentialConstraint>
<Principal Role="Publisher">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="Book">
<PropertyRef Name="PublisherId" />
</Dependent>
</ReferentialConstraint>
</Association>
ReturnType (Function) 元素 (CSDL)
概念結構描述定義語言 (CSDL) 的 ReturnType (Function) 元素會指定 Function 元素中所定義的函式的傳回類型。 您也可以使用 ReturnType 屬性來指定函式傳回類型。
傳回類型可以是任何 EdmSimpleType、實體類型、複雜類型、列類型或這些類型其中一種的集合。
您可以使用 ReturnType (Function) 元素的 Type 屬性或下列其中一個子元素來指定函式的傳回類型:
- CollectionType
- ReferenceType
- RowType
注意
如果您同時以 ReturnType (Function) 元素的 Type 屬性和其中一個子元素來指定函式傳回類型,模型不會驗證。
適用屬性
下表說明可套用至 ReturnType (Function) 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
ReturnType | No | 此函式傳回的型別。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 ReturnType (Function) 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例會使用 Function 元素來定義函式,讓它傳回書籍出版後經過的年數。 請注意,傳回類型是以 ReturnType (Function) 元素的 Type 屬性所指定。
<Function Name="GetYearsInPrint">
<ReturnType Type=="Edm.Int32">
<Parameter Name="book" Type="BooksModel.Book" />
<DefiningExpression>
Year(CurrentDateTime()) - Year(cast(book.PublishedDate as DateTime))
</DefiningExpression>
</Function>
ReturnType (FunctionImport) 元素 (CSDL)
概念結構描述定義語言 (CSDL) 的 ReturnType (FunctionImport) 元素會指定 FunctionImport 元素中所定義的函式的傳回類型。 您也可以使用 ReturnType 屬性來指定函式傳回類型。
傳回類型可以是實體類型、複雜類型或 EdmSimpleType 的任一種集合,
函式的傳回類型是以 ReturnType (FunctionImport) 元素的 Type 屬性指定。
適用屬性
下表說明可套用至 ReturnType (FunctionImport) 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
類型 | No | 函式傳回的型別。 值必須是 ComplexType、EntityType 或 EDMSimpleType 的集合。 |
EntitySet | No | 如果函式傳回實體類型的集合,EntitySet 的值必須是集合所屬的實體集。 否則,EntitySet 屬性不得使用。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 ReturnType (FunctionImport) 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例使用 FunctionImport 傳回書籍和出版商。 請注意,函式會傳回兩個結果集,因此指定了兩個 ReturnType (FunctionImport) 元素。
<FunctionImport Name="GetBooksAndPublishers">
<ReturnType Type=="Collection(BooksModel.Book )" EntitySet=”Books”>
<ReturnType Type=="Collection(BooksModel.Publisher)" EntitySet=”Publishers”>
</FunctionImport>
RowType 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 RowType 元素會為概念模型所定義的函式將未命名的結構定義為參數或傳回類型。
RowType 元素可以是以下元素的子系:
- CollectionType
- 參數
- ReturnType (Function)
RowType 可以擁有下列子元素 (依列出的順序):
- Property (一或多個)
- Annotation 元素 (零或多個)
適用屬性
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 RowType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的模型定義函式使用 CollectionType 元素來指定函式傳回列集合 (如 RowType 元素所指定)。
<Function Name="LastNamesAfter">
<Parameter Name="someString" Type="Edm.String" />
<ReturnType>
<CollectionType>
<RowType>
<Property Name="FirstName" Type="Edm.String" Nullable="false" />
<Property Name="LastName" Type="Edm.String" Nullable="false" />
</RowType>
</CollectionType>
</ReturnType>
<DefiningExpression>
SELECT VALUE ROW(p.FirstName, p.LastName)
FROM SchoolEntities.People AS p
WHERE p.LastName >= somestring
</DefiningExpression>
</Function>
Schema 項目 (CSDL)
Schema 元素是概念模型定義的根目錄元素。 其中包含組成概念模型的物件、函式和容器等定義。
Schema 元素可能包含下列零個或多個子元素:
- 使用
- EntityContainer
- EntityType
- EnumType
- 關聯
- ComplexType
- 函式
Schema 元素可能包含零個或一個 Annotation 元素。
注意
只有 CSDL v2 和之後的版本中才允許使用 Function 元素和註釋元素。
Schema 元素會使用 Namespace 屬性來定義概念模型的實體類型、複雜類型和關聯物件命名空間。 在命名空間中,兩個物件不能有相同的名稱。 命名空間可以跨越多個 Schema 元素和多個 .csdl 檔案。
概念模型命名空間與 Schema 元素的 XML 命名空間不同。 概念模型命名空間 (由 Namespace 屬性所定義) 是實體類型、複雜類型和關聯類型的邏輯容器。 Schema 元素的 XML 命名空間 (以 xmlns 屬性表示) 是 Schema 元素的子元素和屬性的預設命名空間。 表單 https://schemas.microsoft.com/ado/YYYY/MM/edm
的 XML 命名空間 (其中 YYYY 和 MM 分別代表年和月) 會保留給 CSDL。 自訂項目和屬性不能出現在擁有此格式的命名空間中。
適用屬性
下表說明可套用至 Schema 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Namespace | Yes | 概念模型的命名空間。 Namespace 屬性的值會用來構成類型的完整合格名稱。 舉例來說,如果名為 Customer 的 EntityType 位於 Simple.Example.Model 命名空間,EntityType 的完整合格名稱就是 SimpleExampleModel.Customer。 下列字串無法設為 Namespace 屬性的值:System、Transient或 Edm。 Namespace 屬性的值不能與 SSDL 結構描述元素的 Namespace 屬性值相同。 |
別名 | No | 用來取代命名空間名稱的識別項。 舉例來說,如果名為 Customer 的 EntityType 位於 Simple.Example.Model 命名空間,且 Alias 屬性的值是 Model,您可以將 Model.Customer 當作 EntityType 的完整合格名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Schema 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的 Schema 元素包含一個 EntityContainer 元素、兩個 EntityType 元素和一個 Association 元素。
<Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
Namespace="ExampleModel" Alias="Self">
<EntityContainer Name="ExampleModelContainer">
<EntitySet Name="Customers"
EntityType="ExampleModel.Customer" />
<EntitySet Name="Orders" EntityType="ExampleModel.Order" />
<AssociationSet
Name="CustomerOrder"
Association="ExampleModel.CustomerOrders">
<End Role="Customer" EntitySet="Customers" />
<End Role="Order" EntitySet="Orders" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Customer">
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Type="Int32" Name="CustomerId" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false" />
<NavigationProperty
Name="Orders"
Relationship="ExampleModel.CustomerOrders"
FromRole="Customer" ToRole="Order" />
</EntityType>
<EntityType Name="Order">
<Key>
<PropertyRef Name="OrderId" />
</Key>
<Property Type="Int32" Name="OrderId" Nullable="false" />
<Property Type="Int32" Name="ProductId" Nullable="false" />
<Property Type="Int32" Name="Quantity" Nullable="false" />
<NavigationProperty
Name="Customer"
Relationship="ExampleModel.CustomerOrders"
FromRole="Order" ToRole="Customer" />
<Property Type="Int32" Name="CustomerId" Nullable="false" />
</EntityType>
<Association Name="CustomerOrders">
<End Type="ExampleModel.Customer"
Role="Customer" Multiplicity="1" />
<End Type="ExampleModel.Order"
Role="Order" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Customer">
<PropertyRef Name="CustomerId" />
</Principal>
<Dependent Role="Order">
<PropertyRef Name="CustomerId" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
TypeRef 項目 (CSDL)
概念結構描述定義語言 (CSDL) 的 TypeRef 元素會提供現有具名類型的參照。 TypeRef 元素可能是 CollectionType 元素的子系,用來指定函式中包含當作參數或傳回類型的集合。
TypeRef 可以擁有下列子元素 (依列出的順序):
- Documentation (零或一個元素)
- Annotation 元素 (零或一個元素)
適用屬性
下表說明可套用至 TypeRef 元素的屬性。 請注意,DefaultValue、MaxLength、FixedLength、Precision、Scale、Unicode 和 Collation 屬性僅適用於 EDMSimpleTypes。
屬性名稱 | 是必要的 | 值 |
---|---|---|
類型 | No | 所參考的型別名稱。 |
可為 Null | No | True (預設值) 或 False 需視屬性是否可以有 Null 值而定。 [!注意] |
> 在 CSDL v1,複雜類型的屬性須有 Nullable="False" 。 |
||
DefaultValue | No | 屬性的預設值。 |
MaxLength | No | 屬性值的最大長度。 |
FixedLength | No | True 或 False 需視屬性值是否儲存為固定長度的字串而定。 |
有效位數 | No | 屬性值的有效位數。 |
縮放比例 | No | 屬性值的小數位數。 |
SRID | No | 空間系統參照識別碼。 僅對空間類型的屬性有效。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 |
Unicode | No | True 或 False 需視屬性值是否儲存為 Unicode 字串而定。 |
定序 | No | 指定資料來源中使用之定序順序的字串。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 CollectionType 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例所示的模型定義函式使用 TypeRef 元素 (CollectionType 元素的子系) 來指定函式可接受 Department 實體類型的集合。
<Function Name="GetAvgBudget">
<Parameter Name="Departments">
<CollectionType>
<TypeRef Type="SchoolModel.Department"/>
</CollectionType>
</Parameter>
<ReturnType Type="Collection(Edm.Decimal)"/>
<DefiningExpression>
SELECT VALUE AVG(d.Budget) FROM Departments AS d
</DefiningExpression>
</Function>
Using 項目 (CSDL)
概念結構描述定義語言的 Using 元素會匯入存在不同命名空間的概念模型內容。 藉由設定 Namespace 屬性的值,您就能參照其他概念模型所定義的實體類型、複雜類型和關聯類型。 Schema 元素的子系可以有多個 Using 元素。
注意
CSDL 的 Using 元素運作的方式與程式設計語言的 using 陳述式並不完全相同。 以程式設計語言的 using 陳述式匯入命名空間,不會影響原始命名空間中的物件。 在 CSDL 中,匯入的命名空間可以包含實體類型,該實體類型是衍生自原始命名空間中的實體類型。 這會影響在原始命名空間中宣告的實體集。
Using 元素可以有以下子元素:
- Documentation (允許零或一個元素)
- Annotation 元素 (允許零或一個元素)
適用屬性
下表說明可套用至 Using 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Namespace | Yes | 匯入的命名空間名稱。 |
別名 | Yes | 用來取代命名空間名稱的識別項。 雖然這個屬性是必要的,但是不必使用此屬性取代命名空間名稱,來限定物件名稱。 |
注意
您可以將任何數量的註釋屬性 (自訂 XML 屬性) 套用至 Using 元素。 不過,自訂屬性不可屬於任何 XML 命名空間,這是保留給 CSDL 之用。 任兩個自訂屬性的完整名稱不能相同。
範例
下列範例示範了將 Using 元素使用於匯入在他處定義的命名空間。 請注意,所示 Schema 元素的命名空間為 BooksModel
。 Publisher
EntityType 的 Address
屬性是一種複雜類型,定義於 ExtendedBooksModel
命名空間中 (以 Using 元素匯入)。
<Schema xmlns="https://schemas.microsoft.com/ado/2009/11/edm"
xmlns:cg="https://schemas.microsoft.com/ado/2009/11/codegeneration"
xmlns:store="https://schemas.microsoft.com/ado/2009/11/edm/EntityStoreSchemaGenerator"
Namespace="BooksModel" Alias="Self">
<Using Namespace="BooksModel.Extended" Alias="BMExt" />
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
</EntityContainer>
<EntityType Name="Publisher">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="BMExt.Address" Name="Address" Nullable="false" />
</EntityType>
</Schema>
註釋屬性 (CSDL)
概念結構描述定義語言 (CSDL) 中的附註屬性是概念模型中自訂的 XML 屬性。 除了擁有有效的 XML 結構外,下列附註屬性的條件必須成立:
- 附註屬性不能在任何 XML 命名空間之中,這是保留供 CSDL 之用。
- 超過一個以上的附註屬性可以套用至給定的 CSDL 項目。
- 任兩個 Annotation 屬性的完整名稱不能相同。
附註屬性可用來提供與概念模型中之項目有關的額外中繼資料。 您可以使用 System.Data.Metadata.Edm 命名空間中的類別,在執行階段存取註釋元素所包含的中繼資料。
範例
下列範例所示為具有註釋屬性的 EntityType 元素 (CustomAttribute)。 下列範例也顯示套用至實體類型項目的 Annotation 項目。
<Schema Namespace="SchoolModel" Alias="Self"
xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
<EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="People" EntityType="SchoolModel.Person" />
</EntityContainer>
<EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
p:CustomAttribute="Data here.">
<Key>
<PropertyRef Name="PersonID" />
</Key>
<Property Name="PersonID" Type="Int32" Nullable="false"
annotation:StoreGeneratedPattern="Identity" />
<Property Name="LastName" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="FirstName" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="HireDate" Type="DateTime" />
<Property Name="EnrollmentDate" Type="DateTime" />
<p:CustomElement>
Custom metadata.
</p:CustomElement>
</EntityType>
</Schema>
下列程式碼會擷取附註屬性中的中繼資料,並且將它撰寫至主控台:
EdmItemCollection collection = new EdmItemCollection("School.csdl");
MetadataWorkspace workspace = new MetadataWorkspace();
workspace.RegisterItemCollection(collection);
EdmType contentType;
workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomAttribute"))
{
MetadataProperty annotationProperty =
contentType.MetadataProperties["http://CustomNamespace.com:CustomAttribute"];
object annotationValue = annotationProperty.Value;
Console.WriteLine(annotationValue.ToString());
}
以上程式碼假設 School.csdl
檔位於專案的輸出目錄中,而且您已將下列 Imports
和 Using
陳述式加入至專案:
using System.Data.Metadata.Edm;
註釋項目 (CSDL)
概念結構定義語言 (CSDL) 中的 Annotation 項目是概念模型中的自訂 XML 項目。 除了擁有有效的 XML 結構外,下列 Annotation 項目的條件也必須成立:
- Annotation 項目不能存在於保留供 CSDL 使用的任何 XML 命名空間中。
- 多個 Annotation 項目可以同時為指定 CSDL 項目的子系。
- 任兩個 Annotation 項目的完整名稱不能相同。
- Annotation 項目必須出現在指定 CSDL 項目的所有其他子項目之後。
Annotation 項目可用來提供與概念模型中之項目有關的額外中繼資料。 從 .NET Framework 第 4 版開始,您可以使用 System.Data.Metadata.Edm 命名空間中的類別,在執行階段存取註釋元素所包含的中繼資料。
範例
下列範例所示為具有註釋元素 (CustomElement) 的 EntityType 元素。 該範例也顯示套用至實體類型項目的 annotation 屬性。
<Schema Namespace="SchoolModel" Alias="Self"
xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
xmlns="https://schemas.microsoft.com/ado/2009/11/edm">
<EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="People" EntityType="SchoolModel.Person" />
</EntityContainer>
<EntityType Name="Person" xmlns:p="http://CustomNamespace.com"
p:CustomAttribute="Data here.">
<Key>
<PropertyRef Name="PersonID" />
</Key>
<Property Name="PersonID" Type="Int32" Nullable="false"
annotation:StoreGeneratedPattern="Identity" />
<Property Name="LastName" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="FirstName" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="HireDate" Type="DateTime" />
<Property Name="EnrollmentDate" Type="DateTime" />
<p:CustomElement>
Custom metadata.
</p:CustomElement>
</EntityType>
</Schema>
下列程式碼會擷取 annotation 項目中的中繼資料,並且將它撰寫至主控台:
EdmItemCollection collection = new EdmItemCollection("School.csdl");
MetadataWorkspace workspace = new MetadataWorkspace();
workspace.RegisterItemCollection(collection);
EdmType contentType;
workspace.TryGetType("Person", "SchoolModel", DataSpace.CSpace, out contentType);
if (contentType.MetadataProperties.Contains("http://CustomNamespace.com:CustomElement"))
{
MetadataProperty annotationProperty =
contentType.MetadataProperties["http://CustomNamespace.com:CustomElement"];
object annotationValue = annotationProperty.Value;
Console.WriteLine(annotationValue.ToString());
}
以上程式碼假設 School.csdl 檔位於專案的輸出目錄中,而且您已將下列 Imports
和 Using
陳述式加入至專案:
using System.Data.Metadata.Edm;
概念模型類型 (CSDL)
概念結構描述定義語言 (CSDL) 支援一組稱為 EDMSimpleTypes的抽象基本資料類型,它定義了概念模型中的屬性。 EDMSimpleTypes 是儲存體或主機環境支援的基本資料類型的 Proxy。
下表列出 CSDL 所支援的基本資料型別。 該表還列出了可套用至每個 EDMSimpleType 的 Facet。
EDMSimpleType | 描述 | 適用的 Facet |
---|---|---|
Edm.Binary | 包含二進位資料。 | MaxLength、FixedLength、Nullable、Default |
Edm.Boolean | 包含 true 或 false 值。 | Nullable、Default |
Edm.Byte | 包含不帶正負號的 8 位元整數值。 | Precision、Nullable、Default |
Edm.DateTime | 表示日期和時間。 | Precision、Nullable、Default |
Edm.DateTimeOffset | 包含與 GMT 的日期和時間時差 (以分鐘為單位)。 | Precision、Nullable、Default |
Edm.Decimal | 包含固定有效位數和小數位數的數值。 | Precision、Nullable、Default |
Edm.Double | 包含的浮點數精確度達 15 位數。 | Precision、Nullable、Default |
Edm.Float | 包含具有 7 位數精確度的浮點數。 | Precision、Nullable、Default |
Edm.Guid | 包含 16 位元組的唯一識別碼。 | Precision、Nullable、Default |
Edm.Int16 | 包含帶正負號的 16 位元整數值。 | Precision、Nullable、Default |
Edm.Int32 | 包含帶正負號的 32 位元整數值。 | Precision、Nullable、Default |
Edm.Int64 | 包含帶正負號的 64 位元整數值。 | Precision、Nullable、Default |
Edm.SByte | 包含帶正負號的 8 位元整數值。 | Precision、Nullable、Default |
Edm.String | 包含字元資料。 | Unicode、FixedLength、MaxLength、Collation、Precision、Nullable、Default |
Edm.Time | 包含一天的時間。 | Precision、Nullable、Default |
Edm.Geography | Nullable、Default、SRID | |
Edm.GeographyPoint | Nullable、Default、SRID | |
Edm.GeographyLineString | Nullable、Default、SRID | |
Edm.GeographyPolygon | Nullable、Default、SRID | |
Edm.GeographyMultiPoint | Nullable、Default、SRID | |
Edm.GeographyMultiLineString | Nullable、Default、SRID | |
Edm.GeographyMultiPolygon | Nullable、Default、SRID | |
Edm.GeographyCollection | Nullable、Default、SRID | |
Edm.Geometry | Nullable、Default、SRID | |
Edm.GeometryPoint | Nullable、Default、SRID | |
Edm.GeometryLineString | Nullable、Default、SRID | |
Edm.GeometryPolygon | Nullable、Default、SRID | |
Edm.GeometryMultiPoint | Nullable、Default、SRID | |
Edm.GeometryMultiLineString | Nullable、Default、SRID | |
Edm.GeometryMultiPolygon | Nullable、Default、SRID | |
Edm.GeometryCollection | Nullable、Default、SRID |
Facet (CSDL)
概念結構定義語言 (CSDL) 中的 Facet 表示實體型別和複雜型別屬性上的條件約束。 Facet 在下列 CSDL 元素上會以 XML 屬性的形式出現:
- 屬性
- TypeRef
- 參數
下表說明 CSDL 中支援的 Facet。 所有的 Facet 都是選擇性的。 Entity Framework 從概念模型產生資料庫時,會使用下方所列的部分 Facet。
注意
有關概念模型資料類型的資訊,請參閱概念模型類型 (CSDL)。
Facet | 描述 | 適用於 | 用於產生資料庫 | 由執行階段所使用 |
---|---|---|---|---|
定序 | 在執行比較和排序屬性值的作業時,指定要使用的定序順序 (或排序順序)。 | Edm.String | 是 | No |
ConcurrencyMode | 表示屬性值應用於開放式並行存取檢查。 | 所有 EDMSimpleType 屬性 | No | Yes |
Default | 執行個體化時如果沒有提供值,請指定屬性的預設值。 | 所有 EDMSimpleType 屬性 | Yes | Yes |
FixedLength | 指定屬性值的長度是否可以變更。 | Edm.Binary、Edm.String | 是 | 否 |
MaxLength | 指定屬性值的最大長度。 | Edm.Binary、Edm.String | 是 | No |
可為 Null | 指定屬性是否可以有 null 值。 | 所有 EDMSimpleType 屬性 | Yes | Yes |
有效位數 | 如果是類型 Decimal 的屬性,請指定屬性值可以擁有的位數。 如果是類型 Time、DateTime 和 DateTimeOffset 的屬性,請指定屬性值秒數小數點後的位數。 | Edm.DateTime、Edm.DateTimeOffset、Edm.Decimal、Edm.Time | 是 | No |
縮放比例 | 指定屬性值小數點右邊的位數。 | Edm.Decimal | 是 | No |
SRID | 指定空間系統參照系統識別碼。 如需詳細資訊,請參閱 SRID 和 SRID (SQL Server)。 | Edm.Geography、Edm.GeographyPoint、Edm.GeographyLineString、Edm.GeographyPolygon、Edm.GeographyMultiPoint、Edm.GeographyMultiLineString、 Edm.GeographyMultiPolygon、Edm.GeographyCollection、Edm.Geometry、Edm.GeometryPoint、Edm.GeometryLineString、Edm.GeometryPolygon、Edm.GeometryMultiPoint、Edm.GeometryMultiLineString、Edm.GeometryMultiPolygon、Edm.GeometryCollection | No | Yes |
Unicode | 指出屬性值是否儲存為 Unicode。 | Edm.String | Yes | 是 |
注意
從概念模型產生資料庫時,如果 Property 元素的 StoreGeneratedPattern 屬性值位於下列命名空間,產生資料庫精靈就會識別該值:https://schemas.microsoft.com/ado/2009/02/edm/annotation
。 受支援的屬性值為 Identity 和 Computed。 Identity 值會產生資料庫欄,其中包含資料庫產生的識別值。 Computed 值產生的欄會包含在資料庫計算的值。
範例
下列範例顯示 Facet 套用至實體類型的屬性:
<EntityType Name="Product">
<Key>
<PropertyRef Name="ProductId" />
</Key>
<Property Type="Int32"
Name="ProductId" Nullable="false"
a:StoreGeneratedPattern="Identity"
xmlns:a="https://schemas.microsoft.com/ado/2009/02/edm/annotation" />
<Property Type="String"
Name="ProductName"
Nullable="false"
MaxLength="50" />
<Property Type="String"
Name="Location"
Nullable="true"
MaxLength="25" />
</EntityType>