Работа с сущностями с самостоятельным отслеживанием

В приложении Entity Framework контекст объекта отвечает за отслеживание изменений в сущностях в графе объектов. Однако в многоуровневых сценариях на уровне, изменяющем сущности, контекст объекта может быть недоступен. Начиная с версии 4 платформы .NET Framework, сущности с самостоятельным отслеживанием позволяют отслеживать изменения на любом уровне.

Ff407090.note(ru-ru,VS.100).gifПримечание
Используйте сущности с самостоятельным отслеживанием, только если контекст объекта не поддерживается на том уровне, где вносятся изменения в граф объекта. Если контекст объекта доступен, используйте производные типы EntityObject, традиционные (plain-old — POCO) типы объектов CLR или прокси-типы POCO. Дополнительные сведения см. в разделе Работа с объектами (платформа Entity Framework).

Шаблон Генератор сущностей с самостоятельным отслеживанием ADO.NET формирует сущности с самостоятельным отслеживанием, начиная с версии Microsoft Visual Studio 2010. Этот элемент шаблона создает два файла с расширением TT (text template — текстовый шаблон): <имя_модели>.tt и <имя_модели>.Context.tt. Файл <имя_модели>.tt создает типы сущностей и вспомогательный класс, содержащий логику отслеживания изменений, используемую в сущностях с самостоятельным отслеживанием, а также методы расширения, позволяющие задавать состояние этих сущностей. Файл <имя_модели>.Context.tt file создает типизированный контекст ObjectContext и класс расширения, который содержит методы ApplyChanges для классов ObjectContext и ObjectSet. Эти методы проверяют сведения об отслеживании изменений, которые содержатся в графе сущностей с самостоятельным отслеживанием, чтобы вывести набор операций, которые следует выполнить для сохранения изменений в базе данных. Дополнительные сведения см. в разделе ADO.NET Self-Tracking Entity Generator Template.

Ff407090.Important(ru-ru,VS.100).gif Примечание
Служба не должна доверять запросам на получение или обновление данных, исходящим от клиентов и каналов, не являющихся доверенными. Клиент должен пройти проверку подлинности; следует пользоваться безопасным каналом или конвертом сообщения. Запросы клиентов на обновление или получение данных следует проверять на соответствие ожидаемым и разрешенным изменениям для данного сценария.

Ff407090.Important(ru-ru,VS.100).gif Примечание
Не следует использовать в качестве ключей сущностей конфиденциальных сведений (например, номера карточек социального страхования). Тогда конфиденциальные сведения не смогут случайно подвергнуться сериализации в графах сущностей с самостоятельным отслеживанием и попасть к клиенту, который не является полностью доверенным. При использовании независимых сопоставлений исходный ключ сущности, сопоставляемый с сериализуемым, также может быть отправлен клиенту.

Методы расширения для сущности с самостоятельным отслеживанием

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

Метод StartTracking

Метод StartTracking сообщает объекту отслеживания изменений данной сущности, что следует начать регистрацию всех изменений, применяемых к сущности. Сюда входят изменения скалярных свойств, коллекций и ссылок на другие сущности. Сущности с самостоятельным отслеживанием начинают отслеживание самостоятельно после их десериализации в клиенте с помощью WCF (Windows Communication Foundation). Отслеживание включается автоматически для только что созданных сущностей в следующих сценариях.

  • При создании отношения между новой сущностью и сущностью, уже отслеживающей изменения.

  • Применительно к данной сущности вызывается метод MarkAs[State] или AcceptChanges.

Метод StopTracking

Метод StopTracking прекращает регистрацию изменений.

Методы MarkAs

Все методы MarkAs включают отслеживание. Эти методы расширения упрощают явное изменение состояния сущности на Added, Modified, Deleted и Unchanged.

Методы MarkAs[State] возвращают ту сущность, к которой были применены, в новом состоянии. В следующем примере состояние сущности изменяется на Unchanged:

department.Course = new Course { CourseID = courseID }.MarkAsUnchanged();

Метод MarkAsAdded изменяет состояние сущности на Added. Только что созданные сущности с самостоятельным отслеживанием имеют состояние Added, и отслеживание изменений у них не включено.

Метод MarkAsDeleted изменяет состояние сущности на Deleted. Кроме того, этот метод очищает свойства навигации сущности, которая отмечается для удаления. Свойство навигации задается равным null, если оно указывает на объект ссылки. Если свойство навигации представляет коллекцию, вызывается метод Clear. Если метод MarkAsDeleted вызывается применительно к объекту, входящему в состав коллекции, объект удаляется из коллекции. Чтобы отметить каждый объект в коллекции как удаленный, отметьте объекты в копии коллекции. Чтобы получить копию коллекции, вызовите метод ToArray() или ToList() применительно к коллекции, как показано в следующем примере.

List<Course> courses = department.Courses.ToList();

foreach (var c in courses)

{

// Mark each course in the department as Deleted.

c.MarkAsDeleted();

}

Метод MarkAsModified изменяет состояние сущности на Modified. Кроме того, изменение значения свойства сущности, у которой включено отслеживание изменений, устанавливает состояние этой сущности в Modified.

Метод MarkAsUnchanged изменяет состояние сущности на Unchanged. Кроме того, метод AcceptChanges удаляет информацию, относящуюся к отслеживанию изменений данной сущности, и переводит сущность в состояние Unchanged.

AcceptChanges

Метод AcceptChanges удаляет данные, относящиеся к отслеживанию изменений данной сущности, и изменяет состояние сущности на Unchanged. Для сброса состояния отношения нужно вызвать метод AcceptChanges для обеих сущностей, участвующих в этом отношении.

Методы расширения ObjectContext

Метод ApplyChanges проверяет сведения об отслеживании изменений, которые содержатся в графе сущностей с самостоятельным отслеживанием, и выводит набор операций, которые следует выполнить для отражения изменений в базе данных. Существует два метода ApplyChanges — один для ObjectContext, а другой для ObjectSet.

Ff407090.note(ru-ru,VS.100).gifПримечание
Чтобы избежать передачи сообщений об исключениях, содержащих конфиденциальные данные, на клиентский уровень, вызовы методов ApplyChanges и SaveChanges на уровне сервера следует упаковывать в код обработки исключений.

Общие соображения при работе с сущностями с самостоятельным отслеживанием

При работе с сущностями с самостоятельным отслеживанием нужно принимать во внимание следующие соображения.

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

  • Вызовы этой операции службы должны быть не поддерживающими состояние и создавать новый экземпляр контекста объекта. Также рекомендуется создавать контекст объекта в блоке using.

  • Если после отправки измененного на клиенте графа службе вы намерены продолжать работу с тем же графом на клиенте, то вам придется вручную провести итерацию по графу на клиенте, вызывая для каждого объекта метод AcceptChanges для сброса состояния объекта отслеживания изменений. Если объекты в графе содержат свойства со значениями, формируемыми базой данных (например, значения удостоверения или параллелизма), то после вызова метода SaveChanges Entity Framework заменит значения этих свойств значениями, сформированными базой данных. Предусмотрена возможность реализовать собственную операцию службы для возврата клиенту сохраненных объектов или списка сформированных значений свойств для объекта. Затем клиенту потребуется заменить экземпляры объектов или значения свойств объектов теми объектами или значениями свойств, которые были возвращены из операции службы.

  • Объединение графов из нескольких запросов к службе может привести к появлению в итоговом графе повторяющихся значений ключей. Entity Framework не удаляет объекты с повторяющимися ключами при вызове метода ApplyChanges. Вместо этого формируется исключение. Для предотвращения появления графов с повторяющимися значениями ключей придерживайтесь одного из шаблонов, описанных в следующем блоге: Сущности с самостоятельным отслеживанием. Сущности ApplyChanges и повторяющиеся сущности.

  • При изменении связи между объектами путем задания свойства внешнего ключа ссылка на свойство навигации задается равной NULL и не синхронизируется с основной сущностью на клиенте. После присоединения графа к контексту объекта (например, после вызова метода ApplyChanges) свойства внешнего ключа и свойства навигации синхронизируются.

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

  • Сущностям с самостоятельным отслеживанием не разрешается использовать отложенную загрузку.

  • Двоичная сериализация и сериализация в объекты управления состояниями ASP.NET не поддерживается кодом, сформированным из шаблона Генератор сущностей с самостоятельным отслеживанием ADO.NET. Тем не менее этот шаблон можно изменить в целях добавления поддержки двоичной сериализации. Дополнительные сведения см. в разделе Использование двоичной сериализации и ViewState с сущностями с самостоятельным отслеживанием.

См. также

Задачи

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

Другие ресурсы

Работа с наборами сущностей с самостоятельным отслеживанием
Сущности с самостоятельным отслеживанием Silverlight
Использование двоичной сериализации и ViewState с сущностями с самостоятельным отслеживанием