項目集合 (中繼資料)
在 實體資料模型 (EDM) 中,項目集合是負責從 XML 檔案或 Common Language Runtime (CLR) 組件等持續性 (Persistent) 資源載入中繼資料,而且它們位於 MetadataWorkspace 類別的執行個體中。
ADO.NET 會提供 ItemCollection 類別當做核心 API,用以載入和保存記憶體中的中繼資料。ItemCollection 具有許多衍生類別 (Derived Class),例如 ObjectItemCollection、EdmItemCollection、StoreItemCollection 和 StorageMappingItemCollection。其中每個集合類別 (Collection Class) 都是專門用於不同類型的中繼資料。下列各節將說明這些集合類別如何與不同類型的中繼資料互動。
ObjectItemCollection
ObjectItemCollection 類別是負責載入有關物件模型 (Object Model) 的中繼資料。物件模型代表可當做概念模型之程式設計實現使用的 CLR 類別。
ObjectItemCollection 會尋找使用 EdmSchemaAttribute 裝飾的參考組件,然後載入組件中對應至 ADO.NET 實體架構 之持續性類別的類別。更明確地說,它會載入衍生自 System.Data.Objects.DataClasses 的類別。
如果這些類別不存在參考的組件中,ADO.NET 中繼資料基礎結構就會隱含地載入 實體架構 中的 CLR 中繼資料。例如,當您建立 ObjectQuery<T> 類別的新執行個體來建構查詢時,ADO.NET 中繼資料基礎結構就會檢查 <T> 型別參數是否已經存在中繼資料內。如果 <T> 型別參數不存在中繼資料內,ADO.NET 中繼資料基礎結構就會隱含地從包含 <T> 型別參數的組件載入中繼資料。
您也可以從並未在目前應用程式中明確參考的特定組件載入中繼資料。在此情況下,您可以叫用 (Invoke) 在 MetadataWorkspace 類別中定義的 LoadFromAssembly 方法或在 ObjectItemCollection 類別中定義的 LoadFromAssembly 方法。
LoadFromAssembly 方法會在內部存取已註冊的 ObjectItemCollection 並呼叫在 ObjectItemCollection 類別上定義的 LoadFromAssembly 方法。
下列程式碼範例將示範如何從特定組件載入中繼資料。此程式碼範例會使用 AdventureWorks 模型來開啟基礎資料庫的連接。然後,它會明確載入 Human Resources Skills 模型。如需 AdventureWorks 和 Human Resources Skills 模型的詳細資訊,請參閱 AdventureWorks 完整模型 (EDM) 和 人力資源技能 WinApp (EDM 範例應用程式)。
Imports System
Imports System.Data
Imports System.Reflection
Imports System.Collections.ObjectModel
Imports System.Data.Metadata.Edm
Imports AdventureWorksModel
Class LoadAssemblyExample
' This sample illustrates loading metadata from a specific assembly.
Public Shared Sub Main()
Try
' Retrieve a MetadataWorkspace from an ObjectContext:
' AdventureWorksEntities represents the ADO.NET ObjectContext
' that acts as a factory for queries;
' tracks object state; and is used to initiate
' updates against the database.
Using db As AdventureWorksEntities = New AdventureWorksEntities
' Dereference the workspace from the AdventureWorksEntities
' class
' (an ObjectContext specialization).
Dim workspace As MetadataWorkspace = db.MetadataWorkspace
' Load metadata from the HRSkills assembly.
workspace.LoadFromAssembly(Assembly.Load("HRSkills"))
' Get a collection of the EdmTypes from the object model.
Dim types As ReadOnlyCollection(Of EdmType) = _
workspace.GetItems(Of EdmType)(DataSpace.OSpace)
' Iterate through the collection to get each EdmType.
Dim item As EdmType
For Each item In types
Console.WriteLine("Type: {0}, Type in Model: {1} ", _
item.GetType.FullName, item.FullName)
Next
End Using
Catch exceptionMetadata As MetadataException
Console.WriteLine("MetadataException: {0}", _
exceptionMetadata.Message)
End Try
End Sub
End Class
using System;
using System.Data;
using System.Reflection;
using System.Collections.ObjectModel;
using System.Data.Metadata.Edm;
using AdventureWorksModel;
class LoadAssemblyExample
{
// This sample illustrates loading metadata from a specific assembly.
static void Main()
{
try
{
// Retrieve a MetadataWorkspace from an ObjectContext:
// AdventureWorksEntities represents the ADO.NET ObjectContext
// that acts as a factory for queries;
// tracks object state; and is used to initiate
// updates against the database.
using (
AdventureWorksEntities db = new AdventureWorksEntities ())
{
// Dereference the workspace from the AdventureWorksEntities
// class (an ObjectContext specialization).
MetadataWorkspace workspace = db.MetadataWorkspace;
// Load metadata from the HRSkills assembly.
workspace.LoadFromAssembly(
Assembly.Load(@"HRSkills"));
// Get a collection of the EdmTypes from the object model.
ReadOnlyCollection<EdmType> types =
workspace.GetItems<EdmType>(DataSpace.OSpace);
// Iterate through the collection to get each EdmType.
foreach (EdmType item in types)
{
Console.WriteLine("Type: {0}, Type in Model: {1} ",
item.GetType().FullName, item.FullName);
}
}
}
catch (MetadataException exceptionMetadata)
{
Console.WriteLine("MetadataException: {0}",
exceptionMetadata.Message);
}
}
}
EdmItemCollection
EdmItemCollection 類別是負責載入有關概念模型的中繼資料。EdmItemCollection 類別會從概念結構定義語言 (CSDL) 檔 (概念模型的 XML 表示) 載入其中繼資料。
EdmItemCollection 和 StoreItemCollection 可以從持續性資源 (例如檔案)、組件中的資源或 XmlReader 建立。
StoreItemCollection
StoreItemCollection 類別是負責載入有關儲存體 (資料庫) 模型的中繼資料。StoreItemCollection 類別會從存放結構定義語言 (SSDL) 檔 (儲存體模型的 XML 表示) 載入其中繼資料。
EdmItemCollection 和 StoreItemCollection 可以從持續性資源 (例如檔案)、組件中的資源或 XmlReader 建立。
StorageMappingItemCollection
StorageMappingItemCollection 類別是負責載入代表概念模型與儲存體 (資料庫) 模型之間對應的中繼資料。StorageMappingItemCollection 類別會從對應規格語言 (MSL) 檔 (概念模型與儲存體模型之間對應的 XML 表示) 載入其中繼資料。