Поделиться через


Коллекции элементов (метаданные)

В модели 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-представлением сопоставления между концептуальной моделью и моделью хранения.

См. также

Основные понятия

Рабочая область метаданных