Поставщик отражений (службы данных WCF)Reflection Provider (WCF Data Services)

Помимо предоставления данных из модели данных через Entity Framework, службы Службы данных WCFWCF Data Services поддерживают предоставление данных, не определенных строго в модели на основе сущностей.In addition to exposing data from a data model through the Entity Framework, Службы данных WCFWCF Data Services can expose data that is not strictly defined in an entity-based model. Поставщик отражения предоставляет данные в классах, типы возвращаемого значения которых реализуют интерфейс IQueryable<T>.The reflection provider exposes data in classes that return types that implement the IQueryable<T> interface. Службы Службы данных WCFWCF Data Services используют отражение для определения модели данных для таких классов и поддерживают преобразование запросов к таким ресурсам на основе адресов в интегрированные в язык запросы (LINQ) к предоставляемым типам IQueryable<T>.Службы данных WCFWCF Data Services uses reflection to infer a data model for these classes and can translate address-based queries against resources into language integrated query (LINQ)-based queries against the exposed IQueryable<T> types.

Примечание

Метод AsQueryable позволяет получить интерфейс IQueryable<T> любого класса, реализующего интерфейс IEnumerable<T>.You can use the AsQueryable method to return an IQueryable<T> interface from any class that implements the IEnumerable<T> interface. Это позволяет использовать большинство типов универсальных коллекций в качестве источника данных для службы данных.This enables most generic collection types to be used as a data source for your data service.

Поставщик отражения поддерживает иерархии типов.The reflection provider supports type hierarchies. Дополнительные сведения см. в разделе Как Создание службы данных с помощью поставщика отражения.For more information, see How to: Create a Data Service Using the Reflection Provider.

Выведение модели данныхInferring the Data Model

При создании службы данных поставщик выводит модель данных при помощи отражения.When you create the data service, the provider infers the data model by using reflection. В следующем списке показано, как поставщик отражения выводит модель данных.The following list shows how the reflection provider infers the data model:

  • Контейнер сущностей — класс, предоставляющий данные в виде свойств, возвращаемых экземпляром IQueryable<T>.Entity container - the class that exposes the data as properties that return an IQueryable<T> instance. При обращении к модели данных на основе отражения контейнер сущностей представляет корневой объект службы.When you address a reflection-based data model, the entity container represents the root of the service. В одном пространстве имен поддерживается только один класс контейнера сущностей.Only one entity container class is supported for a given namespace.

  • Наборы сущностей — свойства, возвращаемые экземплярами IQueryable<T>, которые рассматриваются как наборы сущностей.Entity sets - properties that return IQueryable<T> instances are treated as entity sets. Наборы сущностей непосредственно адресуются в запросе как ресурсы.Entity sets are addressed directly as resources in the query. Только одно свойство контейнера сущностей может возвращать экземпляр IQueryable<T> данного типа.Only one property on the entity container can return an IQueryable<T> instance of a given type.

  • Типы сущностей — тип T объекта IQueryable<T>, возвращаемого набором сущностейEntity types - the type T of the IQueryable<T> that the entity set returns. Классы, являющиеся частью иерархии наследования, преобразуются поставщиком отражения в эквивалентную иерархию типов сущностей.Classes that are part of an inheritance hierarchy are translated by the reflection provider into an equivalent entity type hierarchy.

  • Ключи сущностей — каждый класс данных, определяющий тип сущности, должен иметь ключевое свойство.Entity keys - each data class that is an entity type must have a key property. Это свойство помечается с помощью атрибута DataServiceKeyAttribute ([DataServiceKeyAttribute]).This property is attributed with the DataServiceKeyAttribute attribute ([DataServiceKeyAttribute]).

    Примечание

    Атрибут DataServiceKeyAttribute следует применять только к сущностям, которые могут быть использованы для уникальной идентификации экземпляра типа сущности.You should only apply the DataServiceKeyAttribute attribute to a property that can be used to uniquely identify an instance of the entity type. При применении к свойству навигации этот атрибут игнорируется.This attribute is ignored when applied to a navigation property.

  • Свойства типов сущностей — помимо ключа сущности, поставщик отражения рассматривает их как доступные свойства (не индексаторы) класса, представляющего тип сущности, следующим образом.Entity type properties - other than the entity key, the reflection provider treats the accessible, non-indexer properties of a class that is an entity type as follows:

    • Если свойство возвращает примитивный тип, оно рассматривается как свойство типа сущности.If the property returns a primitive type, then the property is assumed to be a property of an entity type.

    • Если свойство возвращает тип, который также является типом сущности, то оно рассматривается как свойство навигации, представляющее конец «один» связи «многие к одному» или «один к одному».If the property returns a type that is also an entity type, then the property is assumed to be a navigation property that represents the "one" end of a many-to-one or one-to-one relationship.

    • Если свойство возвращает интерфейс IEnumerable<T> типа сущности, оно рассматривается как свойство навигации, представляющее конец «многие» связи «один ко многим» или «многие ко многим».If the property returns an IEnumerable<T> of an entity type, then the property is assumed to be a navigation property that represents the "many" end of a one-to-many or many-to-many relationship.

    • Если тип возвращаемого значения свойства — тип значения, то свойство представляет сложный тип.If the return type of the property is a value type, then the property represents a complex type.

Примечание

В отличие от модели данных, основанной на реляционной модели сущностей, модели, основанные на поставщике отражения, не поддерживают реляционные данные.Unlike a data model that is based on the entity-relational model, models that are based on the reflection provider do not understand relational data. Для предоставления реляционных данных через службы Службы данных WCFWCF Data Services необходимо использовать Entity Framework.You should use the Entity Framework to expose relational data through Службы данных WCFWCF Data Services.

Сопоставление типов данныхData Type Mapping

Если модель данных выводится из классов .NET Framework, типы-примитивы модели данных сопоставляются с типами данных .NET Framework следующим образом.When a data model is inferred from .NET Framework classes, the primitive types in the data model are mapped to .NET Framework data types as follows:

Тип данных .NET Framework.NET Framework data type Тип модели данныхData model type
Byte []Byte [] Edm.Binary
Boolean Edm.Boolean
Byte Edm.Byte
DateTime Edm.DateTime
Decimal Edm.Decimal
Double Edm.Double
Guid Edm.Guid
Int16 Edm.Int16
Int32 Edm.Int32
Int64 Edm.Int64
SByte Edm.SByte
Single Edm.Single
String Edm.String

Примечание

Типы значений платформы .NET Framework, допускающие значения NULL, сопоставляются с теми же типами модели данных, что и соответствующие типы значений, не принимающие значения NULL..NET Framework nullable value types are mapped to the same data model types as the corresponding value types that cannot be assigned a null.

Включение обновлений в модели данныхEnabling Updates in the Data Model

Чтобы разрешить обновление данных, представляемых этим типом модели данных, поставщик отражения определяет интерфейс IUpdatable.To allow updates to data that is exposed through this kind of data model, the reflection provider defines an IUpdatable interface. Этот интерфейс описывает метод сохранения обновлений, предоставляемых службой данных типов.This interface instructs the data service on how to persist updates to the exposed types. Чтобы включить обновление ресурсов, определенных в модели данных, класс контейнера сущностей должен реализовать интерфейс IUpdatable.To enable updates to resources that are defined by the data model, the entity container class must implement the IUpdatable interface. Пример реализации IUpdatable интерфейсом, см. в разделе как: Создание службы данных с использованием LINQ к источнику данных SQL.For an example of an implementation of the IUpdatable interface, see How to: Create a Data Service Using a LINQ to SQL Data Source.

Интерфейс IUpdatable требует реализации следующих элементов для распространения обновлений источника данных с помощью поставщика отражения.The IUpdatable interface requires that the following members be implemented so that updates can be propagated to the data source by using the reflection provider:

ЧленMember ОписаниеDescription
AddReferenceToCollection Предоставляет функциональность добавления объекта в коллекцию связанных объектов, доступ к которым осуществляется через свойство навигации.Provides the functionality to add an object to a collection of related objects that are accessed from a navigation property.
ClearChanges Предоставляет функциональность отмены отложенных изменений данных.Provides the functionality that cancels pending changes to the data.
CreateResource Предоставляет функциональность создания нового ресурса в указанном контейнере.Provides the functionality to create a new resource in the specified container.
DeleteResource Предоставляет функциональность удаления ресурса.Provides the functionality to delete a resource.
GetResource Предоставляет функциональность извлечения ресурса, идентифицированного указанным запросом и именем типа.Provides the functionality to retrieve a resource that is identified by a specific query and type name.
GetValue Предоставляет функциональность возврата значения свойства ресурса.Provides the functionality to return the value of a property of a resource.
RemoveReferenceFromCollection Предоставляет функциональность удаления объекта из коллекции связанных объектов, доступ к которым осуществляется через свойство навигации.Provides the functionality to remove an object to a collection of related objects accessed from a navigation property.
ResetResource Предоставляет функциональность обновления указанного ресурса.Provides the functionality to update a specified resource.
ResolveResource Предоставляет функциональность возврата ресурса, представленного экземпляром определенного объекта.Provides the functionality to return the resource that is represented by a specific object instance.
SaveChanges Предоставляет функциональность сохранения всех отложенных изменений.Provides the functionality to save all pending changes.
SetReference Предоставляет функциональность задания ссылки на связанный объект с помощью свойства навигации.Provides the functionality to set a related object reference by using a navigation property.
SetValue Предоставляет функциональность задания значения свойства ресурса.Provides the functionality to set the value of the property of a resource.

Обработка параллелизмаHandling Concurrency

Службы данных WCFWCF Data Services поддерживает модель оптимистичного параллелизма, позволяя определять маркер параллелизма для сущности.supports an optimistic concurrency model by enabling you to define a concurrency token for an entity. Этот маркер параллелизма, включающий одно или несколько свойств сущности, используется службой данных для определения, произошло ли изменение в запрашиваемых, обновляемых или удаляемых данных.This concurrency token, which includes one or more properties of the entity, is used by the data service to determine whether a change has occurred in the data that is being requested, updated, or deleted. Когда значения маркера, полученные из eTag в запросе, отличаются от текущих значений сущности, служба данных вызывает исключение.When token values obtained from the eTag in the request differ from the current values of the entity, an exception is raised by the data service. ETagAttribute применяется к типу сущности для определения маркера параллелизма в поставщике отражения.The ETagAttribute is applied to an entity type to define a concurrency token in the reflection provider. Маркер параллелизма не может содержать ключевое свойство или свойство навигации.The concurrency token cannot include a key property or a navigation property. Дополнительные сведения см. в разделе обновление службы данных.For more information, see Updating the Data Service.

Использование запросов LINQ к SQL с помощью поставщика отраженияUsing LINQ to SQL with the Reflection Provider

Поскольку Entity Framework изначально поддерживается по умолчанию, это рекомендованный поставщик данных для работы с реляционными данными в службах Службы данных WCFWCF Data Services.Because the Entity Framework is natively supported by default, it is the recommended data provider for using relational data with Службы данных WCFWCF Data Services. Однако для работы с запросами LINQ к классам SQL можно использовать и поставщик отражения.However, you can use the reflection provider to use LINQ to SQL classes with a data service. Table<TEntity> Результирующие наборы, возвращаемые методами DataContext формируемые LINQ для реализации реляционный конструктор объектов SQL (реляционный конструктор объектов) IQueryable<T> интерфейс.The Table<TEntity> result sets that are returned by methods on the DataContext generated by the LINQ to SQL Object Relational Designer (O/R Designer) implement the IQueryable<T> interface. Это позволяет поставщику отражения получать доступ к таким методам и возвращать данные сущностей с сервера SQL Server при помощи сформированных классов LINQ to SQL.This enables the reflection provider to access these methods and return entity data from SQL Server by using the generated LINQ to SQL classes. Однако, поскольку запрос LINQ to SQL не реализует интерфейс IUpdatable, необходимо добавить разделяемый класс, расширяющий имеющийся разделяемый класс DataContext и определяющий реализацию интерфейса IUpdatable.However, because LINQ to SQL does not implement the IUpdatable interface, you need to add a partial class that extends the existing DataContext partial class to add the IUpdatable implementation. Дополнительные сведения см. в разделе Как Создание службы данных с использованием LINQ к источнику данных SQL.For more information, see How to: Create a Data Service Using a LINQ to SQL Data Source.

См. такжеSee also