Коллекции элементов (метаданные)
В модели Entity Data Model (EDM) коллекции элементов обеспечивают загрузку метаданных из таких постоянных ресурсов, как XML-файлы или сборки CLR, и находятся в экземпляре класса MetadataWorkspace.
В ADO.NET предоставляется класс ItemCollection как основной API-интерфейс для загрузки и хранения метаданных в оперативной памяти. В коллекции ItemCollection имеется несколько производных классов, таких как ObjectItemCollection, EdmItemCollection, StoreItemCollection и StorageMappingItemCollection. Каждый из этих классов коллекции специализирован для разных типов метаданных. В следующих разделах показано, как эти классы коллекций взаимодействуют с различными типами метаданных.
ObjectItemCollection
Класс ObjectItemCollection отвечает за загрузку метаданных о модели объектов. Модель объектов представляет классы CLR, которые могут использоваться как программная реализация концептуальной модели.
В ObjectItemCollection выполняется поиск сборок, указанных в ссылках и обозначенных с помощью EdmSchemaAttribute, а затем загружаются классы из сборок, которые соответствуют постоянным классам для ADO.NET Entity Framework. В частности, загружаются классы, которые происходят от System.Data.Objects.DataClasses.
Если эти классы не существуют в сборках, указанных в ссылках, то в инфраструктуре метаданных ADO.NET неявно загружаются метаданные CLR из Entity Framework. Например, если создается новый экземпляр класса ObjectQuery<T> для формирования запроса, то в инфраструктуре метаданных ADO.NET производится проверка того, находится ли уже параметр типа <T> в метаданных или нет. Если параметр типа <T> не находится в метаданных, то в инфраструктуре метаданных ADO.NET неявно загружаются метаданные из сборки, которая включает параметр типа <T>.
Можно также загрузить метаданные из конкретной сборки, которая явно не указана в одной из ссылок в текущем приложении. В этом случае можно вызвать либо метод LoadFromAssembly, который определен в классе MetadataWorkspace, либо метод LoadFromAssembly, определенный в классе ObjectItemCollection.
В самом методе LoadFromAssembly осуществляется доступ к зарегистрированной в нем коллекции ObjectItemCollection и вызывается метод LoadFromAssembly, который определен применительно к классу ObjectItemCollection.
В следующем образце кода показано, как загрузить метаданные из конкретной сборки. В этом образце кода используется модель AdventureWorks для открытия соединения с основной базой данных. После этого происходит явная загрузка модели Human Resources Skills. Дополнительные сведения о моделях AdventureWorks и Human Resources Skills см. в разделах Полная модель AdventureWorks (модель EDM) и Приложение Human Resources Skills для Windows (образец приложения модели 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-представлением сопоставления между концептуальной моделью и моделью хранения.