Шаблон генератора сущностей с самостоятельным отслеживанием ADO.NET
Этот раздел содержит общие сведения о шаблоне Генератора сущностей с самостоятельным отслеживанием ADO.NET, который поставляется вместе с Visual Studio 2010. В разделе также показано, как настроить текстовой шаблон. Шаблон Генератора сущностей с самостоятельным отслеживанием ADO.NET формирует код уровня объекта, который включает типизированный контекст ObjectContext и классы сущностей, содержащие логику состояния с самостоятельным отслеживанием. При работе с многоуровневыми приложениями можно использовать самоотслеживающиеся сущности. Дополнительные сведения см. в разделах Working with Self-Tracking Entities и Walkthrough: Serialize Self-Tracking Entities.
Шаблон Генератора сущностей с самостоятельным отслеживанием ADO.NET включает два файла с текстовыми шаблонами: <имя модели>.tt и <имя модели>.Context.tt. Шаблон <имя модели>.Context.tt формирует типизированный контекст ObjectContext. Шаблон <имя модели>.tt формирует типы сущностей с самостоятельным отслеживанием.
Оба текстовых шаблона начинаются со встроенных директив, которые показывают системе обработки текстовых шаблонов, как обрабатывать шаблон. Обратите внимание, что текстовый шаблон включает TTINCLUDE-файл. TTINCLUDE-файл содержит классы приложения, работающие вместе с шаблонами ADO.NET в процессе создания кода. Дополнительные сведения о TTINCLUDE-файле см. в разделе Общие сведения об TTINCLUDE-файле (платформа Entity Framework).
<#@ template language="VB" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.VB.ttinclude"#>
<#@ output extension=".vb"#>
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#>
Далее код создает и запускает вспомогательные классы, которые определены в TTINCLUDE-файле.
Dim code As New CodeGenerationTools(Me)
Dim ef As New MetadataTools(Me)
Dim loader As New MetadataLoader(Me)
Dim region As New CodeRegion(Me)
Dim fileManager As EntityFrameworkTemplateFileManager = EntityFrameworkTemplateFileManager.Create(Me)
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataTools ef = new MetadataTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this);
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
Этот код также инициализирует строку inputFile. Если шаблон переносится из проекта, содержащего EDMX-файл, в другой проект, необходимо изменить строку inputFile, указав относительное местоположение EDMX-файла.
Dim inputFile As String = "SchoolModel.edmx"
string inputFile = @"SchoolModel.edmx";
В следующих двух разделах подробно описано, что создает каждый TT-файл.
<имя модели>.Context.tt
Шаблон <имя модели>.Context.tt формирует два исходных файла. В обозревателе решений исходные файлы появляются под файлом <имя модели>.Context.tt.
Файл <имя модели>.Context.cs (или vb). Формируемый исходный код содержит определение для типизированного класса ObjectContext. Определение включает следующее:
Перегруженные варианты конструктора. Конструкторы устанавливают создание прокси в значение false и регистрируют ObjectMaterializedEventHandler. Дополнительные сведения об объектах POCO (традиционных объектах среды CLR) и объектах прокси см. в разделе Working with POCO Entities.
Свойства ObjectSet.
Методы импорта функций (если они определены в концептуальной модели).
Файл <имя модели>.Context.Extensions.cs (или vb). Формируемый исходный файл содержит два метода расширения ApplyChanges (один для контекста ObjectContext и другой для ObjectSet) и закрытые методы, поддерживающие метод ApplyChanges. Метод ApplyChanges проверяет сведения об отслеживании изменений, которые содержатся в графе сущностей с самостоятельным отслеживанием, и формирует набор операций, которые следует выполнить, чтобы отразить изменения в базе данных.
<имя модели>.tt
Шаблон <имя модели>.Context.tt формирует несколько исходных файлов. Исходные файлы появляются под файлом <имя модели>.tt в обозревателе решений.
Файл <имя модели>.cs (или .vb), который содержит следующее:
Определение для вспомогательного класса ObjectChangeTracker. Экземпляр ObjectChangeTracker содержит и отслеживает информацию обо всех изменениях, внесенных в типы, которые реализуют IObjectWithChangeTracker. ObjectChangeTracker является частью контракта данных объектов с самостоятельным отслеживанием и поэтому сериализуется вместе с ними.
Определение для интерфейса IObjectWithChangeTracker. Интерфейс реализуется сущностями с самостоятельным отслеживанием и содержит только одно свойство, доступное только для чтения, для извлечения объекта ObjectChangeTracker для сущности.
Методы расширения, определенные для типов IObjectWithChangeTracker и позволяющие управлять состоянием сущностей посредством объекта ObjectChangeTracker. Далее приводится список методов расширения: MarkAs[состояние], StartTracking, StopTracking и AcceptChanges. Сведения о том, что делает каждый из методов расширения, см. в разделе Working with Self-Tracking Entities.
Определение для TrackableCollection из T, который происходит от ObservableCollection. Каждая сущность, которая имеет свойства навигации по коллекции, регистрирует обработчик для события CollectionChanged на объекте TrackableCollection из T для этого свойства навигации. Обработчик выполняет отслеживание изменений и логику, которая синхронизирует оба конца связи.
Определение интерфейса INotifyComplexPropertyChanging. Интерфейс обеспечивает событие, которое возникает при изменении сложных свойств. Изменением может быть либо назначение экземпляра нового сложного типа для сложного свойства, либо изменение скалярного свойства на экземпляре сложного типа.
Определение перечисления ObjectState. Список перечислителя ObjectState включает следующие константы: Unchanged, Added, Modified и Deleted.
В файле есть и другие типы, используемые для хранения сведений о состоянии внутри ObjectChangeTracker. Дополнительные сведения см. в создаваемых файлах <имя модели>.cs или <имя модели>.vb.
Файл для каждого типа сущности и сложного типа, определенного в концептуальной модели: <имя сущности или сложного типа>.cs (vb).
Типы сущностей являются разделяемыми классами, которые исполняют IObjectWithChangeTracker и INotifyPropertyChanged (для поддержки двусторонней привязки данных в Windows Forms, WPF и Silverlight).
Атрибут DataContract добавляется поверх класса, чтобы класс мог быть сериализован. Кроме того,
IsReference = true
указывается на атрибуте DataContract. Это означает, что сериализация для этого типа является глубокой сериализацией.Атрибуты KnownType добавляются поверх класса. Для каждого типа, для которого данный тип сущности имеет свойство навигации, существуют атрибуты KnownType.
Определение классов сущности включает следующее: примитивные свойства, сложные свойства, свойства навигации, свойство ChangeTracker и методы, обеспечивающие логику синхронизации связей.
Сложные типы являются частичными классами, которые исполняют INotifyComplexPropertyChanging и INotifyPropertyChanged.
Настройка кода уровня объекта
Для настройки способа создания кода уровня объекта необходимо изменить TT-файл. Можно изменить имя контекста типизированного объекта, добавить новые свойства или атрибуты на типах сущностей или изменить существующие, а также сделать так, чтобы тип сущности наследовал какой-то интерфейс.
Для настройки кода уровня объекта измените блоки текста в вашем TT-файле. Блок текста определяется за пределами тегов <# и #>. Чтобы изменить имя контекста типизированного объекта, откройте файл <имя модели>.Context.tt и добавьте слово (например, My
) прямо перед всеми экземплярами <#=code.Escape(container)#>
. Затем, если имя контейнера в EDMX-файле — SchoolEntities
, именем контейнера в созданном коде будет MySchoolEntities.
Дополнительные сведения см. в разделе Как настроить создание кода уровня объекта (конструктор моделей EDM).
См. также
Основные понятия
Общие сведения об TTINCLUDE-файле (платформа Entity Framework)
Другие ресурсы
Working with Self-Tracking Entities
Walkthrough: Serialize Self-Tracking Entities