ADO.NET 自跟踪实体生成器模板

本主题概述了随 Visual Studio 2010 提供的**“ADO.NET 自跟踪实体生成器”**模板。 本主题还演示了如何自定义文本模板。 **“ADO.NET 自跟踪实体生成器”**模板可生成对象层代码,此代码由类型化 ObjectContext 和包含自跟踪状态逻辑的实体类组成。 使用 N 层应用程序时使用自跟踪实体。 有关更多信息,请参见Working with Self-Tracking EntitiesWalkthrough: Serialize Self-Tracking Entities

**“ADO.NET 自跟踪实体生成器”**模板由两个文本模板文件组成:<模型名称>.tt 和 <模型名称>.Context.tt。 <模型名称>.Context.tt 模板生成类型化 ObjectContext<模型名称>.tt 模板生成自跟踪实体类型。

两个文本模板均以内置指令开始,这些指令指示文本模板处理引擎如何处理模板。 请注意,文本模板包含 .ttinclude 文件。 .ttinclude 文件包含可帮助 ADO.NET 模板完成代码生成过程的实用工具类。 有关 .ttinclude 文件的更多信息,请参见实体框架实用工具 .ttinclude 文件

<#@ 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 文件中定义的 Helper 类进行实例化和初始化。

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 类的定义。 此定义包括:

  • 一个名为 <模型名称>.Context.Extensions.cs(或 vb)的文件。 生成的源文件包含两个 ApplyChanges 扩展方法(一个用于 ObjectContext,另一个用于 ObjectSet)和支持 ApplyChanges 方法的私有方法。 ApplyChanges 方法检查自跟踪实体图中的更改跟踪信息,并推断在数据库中反映这些更改所必须执行的操作集。

<模型名称>.tt

<模型名称>.tt 模板生成多个源文件。 源文件显示在解决方案资源管理器中的 <模型名称>.tt 文件的下面。

  • 一个名为 <模型名称>.cs(或 vb)的文件,包含以下内容:

    • ObjectChangeTracker Helper 类的定义。 ObjectChangeTracker 实例包含并跟踪有关对实现 IObjectWithChangeTracker 的类型所做的所有更改的信息。 ObjectChangeTracker 是自跟踪对象的数据协定的一部分,因此将与它们一起进行序列化。

    • IObjectWithChangeTracker 接口的定义。 此接口由自跟踪实体实现,并包含一个只读属性来为实体检索 ObjectChangeTracker

    • IObjectWithChangeTracker 类型定义的扩展方法,可用于通过 ObjectChangeTracker 操作实体状态。 以下是扩展方法的列表:MarkAs[State]、StartTrackingStopTrackingAcceptChanges。 有关每个扩展方法所执行的操作的信息,请参见Working with Self-Tracking Entities

    • 派生自 ObservableCollectionTTrackableCollection 的定义。 每个具有集合导航属性的实体都为该导航属性的 TTrackableCollection 上的 CollectionChanged 事件注册一个处理程序。 此处理程序执行更改跟踪和用于同步关系的两端的逻辑。

    • INotifyComplexPropertyChanging 接口的定义。 此接口提供一个将在复杂属性更改时发生的事件。 此更改既可以是将一个新的复杂类型实例分配给一个复杂属性,也可以是更改复杂类型实例的标量属性。

    • ObjectState 枚举的定义。 ObjectState 枚举列表由以下常量组成:UnchangedAddedModifiedDeleted.

    • 文件中还有其他用于存储 ObjectChangeTracker 中的状态信息的类型。 有关更多信息,请查看生成的 <模型名称>.cs 或 <模型名称>.vb 文件。

  • 与概念模型中定义的每个实体类型和复杂类型对应的文件:<实体或复杂类型名称>.cs (vb)。

    • 实体类型是用于实现 IObjectWithChangeTrackerINotifyPropertyChanged(以便支持 Windows Forms、WPF 和 Silverlight 中的双向数据绑定)的分部类。

      可在类的顶部添加 DataContract 特性以允许对类进行序列化。 此外,可在 DataContract 特性上指定 IsReference = true。 这意味着,此类型的序列化是一个深度序列化。

      在类的顶部添加 KnownType 特性。 对于此实体类型具有与之相关的导航属性的每个类型,都有一个 KnownType 特性。

      实体类的定义包括基元属性、复杂属性、导航属性、ChangeTracker 属性以及有助于关系同步逻辑的方法。

    • 复杂类型是用于实现 INotifyComplexPropertyChangingINotifyPropertyChanged 的分部类。

自定义对象层代码

若要自定义生成对象层代码的方式,必须修改 .tt 文件。 您可能需要修改类型化对象上下文的名称;为实体类型添加新的或者修改现有的属性或特性;或者让实体类型从某个接口继承。

若要自定义对象层代码,请修改 .tt 文件中的文本块。 文本块在 <##> 标记外定义。 若要更改类型化对象上下文的名称,请打开 <模型名称>.Context.tt 文件,并在所有 <#=code.Escape(container)#> 的紧前面添加相应的单词(例如,My)。 然后,如果容器在 .edmx 文件中的名称为 SchoolEntities,则容器在生成的代码中的名称将为 MySchoolEntities.

有关更多信息,请参见如何:自定义对象层代码生成(实体数据模型设计器)

另请参见

概念

实体框架实用工具 .ttinclude 文件

其他资源

Working with Self-Tracking Entities
Walkthrough: Serialize Self-Tracking Entities