Работа с сущностями POCO (платформа Entity Framework)
Платформа Entity Framework позволяет использовать совместно с моделью собственные пользовательские классы данных, не внося в них никакие изменения. Это означает, что с моделью данных могут быть использованы традиционные объекты среды CLR (POCO), например существующие объекты домена. Классы данных POCO (которые также называются объектами, пропускающими сохраняемость), которые сопоставляются с сущностями, определяемыми в модели данных, поддерживают в основном ту же обработку при запросах, вставке, обновлении и удалении, что и типы сущностей, которые были созданы средствами модель EDM (сущностная модель данных) .
Требования к сопоставлению
Чтобы использовать сущности POCO с моделью данных, имя типа сущности должно совпадать с именем пользовательского класса данных, а каждое из свойств типа сущности должно быть сопоставлено с открытым свойством пользовательского класса данных. Имена типов и имена каждого из сопоставленных свойств должны быть эквивалентными. Сведения об изменении сущностей в концептуальной модели см. в разделе How to: Create and Modify Entity Types.
Примечание |
---|
Сопоставление сущностей 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.
Примечание |
---|
Даже если объект прокси-типа создан, он не имеет возможностей отложенной загрузки и отслеживания изменений, присущих прокси-объекту. |
В процессе двоичной сериализации и контрактной сериализации данных связанные объекты сериализуются вместе с главным объектом. В ходе отложенной загрузки выполняется запрос для каждого свойства навигации связи, к которому выполняется обращение, а двоичный сериализатор и сериализатор контрактов данных WCF получают доступ ко всем свойствам навигации связи. Это может вызвать выполнение большого числа непредвиденных запросов в ходе сериализации. Если не отключено создание прокси-типов (при котором отключается и отложенная загрузка), то отключите ее явным образом, как показано в следующем примере.
' Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;
Дополнительные сведения см. в разделе Сериализация объектов (платформа Entity Framework).
Общие сведения об API-интерфейсах прокси-объектов
Следующие API-интерфейсы используются для работы с прокси-объектами POCO.
Элемент | Описание |
---|---|
Создает новый прокси-объект 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. |
Метод System.Data.Objects.ObjectContext.GetObjectType(System.Type) — это статический метод, который возвращает тип POCO, производным от которого будет указанный прокси-объект, если прокси-тип был передан в качестве аргумента. Если был передан тип, отличный от прокси-типа, то метод возвращает тот же тип. |
|
CreateProxyTypes |
Создает набор прокси-типов для указанных типов POCO в соответствии с метаданными, загруженными в ObjectContext. Этот метод не создает экземпляры объектов созданных прокси-типов. Например, следующий код создает прокси-объекты для классов POCO При загрузке объектов из источника данных или созданных новых объектов с CreateObject, Entity Framework создает прокси-типы для классов POCO во время выполнения. Однако возможны ситуации, когда необходимо создать прокси-типы заранее. Например, при сериализации графа объектов с выходом за пределы AppDomain может возникнуть необходимость проверить существование соответствующих прокси-типов в целевой среде. Если эти типы не существуют, то десериализация завершится ошибкой. |
Метод GetKnownProxyTypes — это статический метод, который возвращает перечисление, содержащее все прокси-типы, созданные на данный момент в AppDomain. В сценариях сериализации метод можно использовать для получения всех типов, которые должны содержаться в целевой среде и распознаваться модулем сериализации. |
В этом разделе
Требования к созданию прокси-сущностей POCO (платформа Entity Framework)
Загрузка связанных сущностей POCO (платформа Entity Framework)
Отслеживание изменений в сущностях POCO (платформа Entity Framework)
Как определить сущности POCO (платформа Entity Framework)
Как определить контекст пользовательского объекта (платформа Entity Framework)
Как определить контекст пользовательского объекта (платформа Entity Framework)
Как создать сущность POCO с прокси (платформа Entity Framework)
Как явным образом загрузить сущности POCO (платформа Entity Framework)
Как обнаружить изменения в сущностях POCO
Как изменить связи между сущностями POCO (платформа Entity Framework)
Ниже представлены записи блога об объектах POCO из ADO.NET.
POCO в Entity Framework 4 — часть 2
POCO в Entity Framework 4 — часть 3
См. также
Основные понятия
Настройка объектов (платформа Entity Framework)
Определение отношений и управление отношениями (платформа Entity Framework)