Работа с сущностями POCO (платформа Entity Framework)

Платформа Entity Framework позволяет использовать совместно с моделью собственные пользовательские классы данных, не внося в них никакие изменения. Это означает, что с моделью данных могут быть использованы традиционные объекты среды CLR (POCO), например существующие объекты домена. Классы данных POCO (которые также называются объектами, пропускающими сохраняемость), которые сопоставляются с сущностями, определяемыми в модели данных, поддерживают в основном ту же обработку при запросах, вставке, обновлении и удалении, что и типы сущностей, которые были созданы средствами модель EDM (сущностная модель данных) .

Требования к сопоставлению

Чтобы использовать сущности POCO с моделью данных, имя типа сущности должно совпадать с именем пользовательского класса данных, а каждое из свойств типа сущности должно быть сопоставлено с открытым свойством пользовательского класса данных. Имена типов и имена каждого из сопоставленных свойств должны быть эквивалентными. Сведения об изменении сущностей в концептуальной модели см. в разделе How to: Create and Modify Entity Types.

Dd456853.note(ru-ru,VS.100).gifПримечание
Сопоставление сущностей POCO не поддерживается в том случае, если к пользовательским классам данных применены какие-либо из атрибутов сопоставления, включая атрибут EdmSchemaAttribute на уровне сборки.

Шаблон POCO можно использовать для создания из концептуальной модели типов сущности, пропускающих сохраняемость. Этот шаблон не входит в состав Visual Studio. Его можно загрузить из коллекции Visual Studio.

Создание прокси-объекта

Чтобы платформа Entity Framework отслеживала изменения в классах POCO по мере их внесения и чтобы обеспечить поддержку отложенной загрузки связанных объектов, классы POCO должны соответствовать требованиям, описанным в разделе Требования к созданию прокси-сущностей POCO (платформа Entity Framework).

Если создание прокси-объектов для сущностей POCO разрешено, то изменения, вносимые в граф и значения свойств объектов, отслеживаются платформой Entity Framework автоматически по мере их внесения. Сведения о параметрах отслеживания изменений с использованием и без использования прокси-объектов см. в разделе Отслеживание изменений в сущностях POCO (платформа Entity Framework).

Можно использовать комбинацию сущностей POCO и прокси-объектов сущностей. Чтобы отключить создание прокси-объектов, установите свойство ProxyCreationEnabled в значение false для экземпляра ObjectContextOptions, возвращенного свойством ContextOptions объекта ObjectContext:

' Disable proxy object creation. 
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;

Дополнительные сведения см. в разделе Как создать сущность POCO с прокси (платформа Entity Framework).

Сериализация прокси-объектов POCO

Прямая сериализация и десериализация прокси-объектов в Windows Communication Foundation (WCF) не поддерживается, поскольку модуль сериализации DataContractSerializer в состоянии выполнять эти операции только для известных типов, а типы прокси к ним не относятся. Если необходимо обеспечить сериализацию сущностей POCO, отключите создание прокси-объектов или воспользуйтесь классом ProxyDataContractResolver, чтобы сериализовать прокси-объекты как исходные сущности POCO. Чтобы отключить создание прокси-объектов, установите свойство ProxyCreationEnabled в значение false.

Класс ProxyDataContractResolver сопоставляет типы прокси с типами POCO во время сериализации. Чтобы модуль сериализации DataContractSerializer использовал в операциях службы класс ProxyDataContractResolver, определите класс атрибута, применяемый к операциям службы, который будет внутри себя использовать ProxyDataContractResolver для сопоставления типов прокси с чистыми типами POCO. Необходимо связать этот класс атрибутов с методами, являющимися частью контракта службы приложения WCF.

Клиент будет получать и выполнять десериализацию фактических сущностей POCO. Эти классы не будут иметь возможностей отложенной загрузки и отслеживания изменений, которые присущи прокси-объектам. Для отслеживания изменений в этих сущностях на нескольких уровнях используйте сущности с самостоятельным отслеживанием. Сущности с самостоятельным отслеживанием представляют собой сущности POCO, которые не имеют зависимостей в Entity Framework и содержат собственную логику отслеживания изменений. Дополнительные сведения см. в разделе Пошаговое руководство по выполнению сериализации сущностей с самостоятельным отслеживанием (платформа Entity Framework).

Дополнительные сведения см. в разделе Пошаговое руководство. Сериализация прокси-сущностей POCO с помощью WCF (платформа Entity Framework).

Прокси-объекты могут быть сериализованы и десериализованы с использованием двоичной сериализации. Однако при сериализации графа объекта с выходом за пределы AppDomain необходимо убедиться в том, что определения прокси-типов существуют в целевой среде. Если эти типы не существуют, то десериализация завершится ошибкой. Проверить существование типа можно с помощью метода CreateProxyTypes.

Dd456853.note(ru-ru,VS.100).gifПримечание
Даже если объект прокси-типа создан, он не имеет возможностей отложенной загрузки и отслеживания изменений, присущих прокси-объекту.

В процессе двоичной сериализации и контрактной сериализации данных связанные объекты сериализуются вместе с главным объектом. В ходе отложенной загрузки выполняется запрос для каждого свойства навигации связи, к которому выполняется обращение, а двоичный сериализатор и сериализатор контрактов данных WCF получают доступ ко всем свойствам навигации связи. Это может вызвать выполнение большого числа непредвиденных запросов в ходе сериализации. Если не отключено создание прокси-типов (при котором отключается и отложенная загрузка), то отключите ее явным образом, как показано в следующем примере.

' Disable lazy loading. 
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;

Дополнительные сведения см. в разделе Сериализация объектов (платформа Entity Framework).

Общие сведения об API-интерфейсах прокси-объектов

Следующие API-интерфейсы используются для работы с прокси-объектами POCO.

Элемент Описание

CreateObject

Создает новый прокси-объект POCO, если класс POCO отвечает требованиям, описанным в подразделе Требования к созданию прокси-сущностей POCO (платформа Entity Framework), а параметру ProxyCreationEnabled присвоено значение true. В противном случае создает объект типа универсального аргумента. Универсальный аргумент этого метода может быть любым конкретным ссылочным типом (абстрактные классы, интерфейсы и типы значения не поддерживаются). Если в качестве универсального типа выступает тип CLR, не сопоставленный с концептуальной моделью, либо тип, не отвечающий требованиям к созданию прокси-объектов, то метод попытается вызвать любой конструктор переданного типа без параметров, чтобы создать и вернуть новый экземпляр типа. Помимо метода CreateObject объекта ObjectContext, можно использовать методы CreateObject и CreateObject объекта ObjectSet. Дополнительные сведения см. в разделе Как создать сущность POCO с прокси (платформа Entity Framework).

Этот метод не добавляет созданный объект в контекст объекта. Для добавления объекта в контекст необходимо вызывать методы, описанные в разделе Создание, добавление, изменение и удаление объектов (платформа Entity Framework).

ProxyCreationEnabled

Если этот флаг установлен в значение true, то Entity Framework предпринимает попытку создать прокси-объекты для сущностей POCO. По умолчанию флаг ProxyCreationEnabled имеет значение true.

GetObjectType

Метод System.Data.Objects.ObjectContext.GetObjectType(System.Type) — это статический метод, который возвращает тип POCO, производным от которого будет указанный прокси-объект, если прокси-тип был передан в качестве аргумента. Если был передан тип, отличный от прокси-типа, то метод возвращает тот же тип.

CreateProxyTypes

Создает набор прокси-типов для указанных типов POCO в соответствии с метаданными, загруженными в ObjectContext. Этот метод не создает экземпляры объектов созданных прокси-типов. Например, следующий код создает прокси-объекты для классов POCO Customer и Order: context.CreateProxyTypes(new Type[] { typeof(Customer), typeof(Order) });

При загрузке объектов из источника данных или созданных новых объектов с CreateObject, Entity Framework создает прокси-типы для классов POCO во время выполнения. Однако возможны ситуации, когда необходимо создать прокси-типы заранее. Например, при сериализации графа объектов с выходом за пределы AppDomain может возникнуть необходимость проверить существование соответствующих прокси-типов в целевой среде. Если эти типы не существуют, то десериализация завершится ошибкой.

GetKnownProxyTypes

Метод GetKnownProxyTypes — это статический метод, который возвращает перечисление, содержащее все прокси-типы, созданные на данный момент в AppDomain. В сценариях сериализации метод можно использовать для получения всех типов, которые должны содержаться в целевой среде и распознаваться модулем сериализации.

В этом разделе

Требования к созданию прокси-сущностей POCO (платформа Entity Framework)

Загрузка связанных сущностей POCO (платформа Entity Framework)

Отслеживание изменений в сущностях POCO (платформа Entity Framework)

Как определить сущности POCO (платформа Entity Framework)

Как определить контекст пользовательского объекта (платформа Entity Framework)

Как настроить файлы моделирования и сопоставления для работы с пользовательскими объектами (платформа Entity Framework)

Как определить контекст пользовательского объекта (платформа Entity Framework)

Как создать сущность POCO с прокси (платформа Entity Framework)

Как явным образом загрузить сущности POCO (платформа Entity Framework)

Как обнаружить изменения в сущностях POCO

Как изменить связи между сущностями POCO (платформа Entity Framework)

Ниже представлены записи блога об объектах POCO из ADO.NET.

POCO

POCO в Entity Framework 4 — часть 2

POCO в Entity Framework 4 — часть 3

См. также

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

Настройка объектов (платформа Entity Framework)
Определение отношений и управление отношениями (платформа Entity Framework)