ADO.NET 自我追蹤實體產生器範本

本主題將提供隨附於 Visual Studio 2010 之 [ADO.NET 自我追蹤實體產生器] 範本的概觀。 本主題也將示範如何自訂文字範本。 [ADO.NET 自我追蹤實體產生器] 範本會產生物件層程式碼,而這個程式碼是由具型別的 ObjectContext 以及包含自我追蹤狀態邏輯的實體類別所組成。 使用多層式架構 (N-Tier) 應用程式時,請使用自我追蹤實體。 如需詳細資訊,請參閱Working with Self-Tracking EntitiesWalkthrough: Serialize Self-Tracking Entities

[ADO.NET 自我追蹤實體產生器] 範本包含兩個文字範本檔案:<模型名稱>.tt 和 <模型名稱>.Context.tt。 <模型名稱>.Context.tt 範本會產生具型別的 ObjectContext<模型名稱>.tt 範本會產生自我追蹤實體類型。

這兩個文字範本都以內建的指示詞為開頭,可指示文字範本處理引擎如何處理範本。 請注意,這些文字範本都包含 .ttinclude 檔案。 這個 .ttinclude 檔案包含可協助 ADO.NET 範本進行程式碼產生處理序的公用程式類別。 如需 .ttinclude 檔案的詳細資訊,請參閱 Entity Framework 公用程式 .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 類別的定義。 其定義包括:

    • 建構函式多載。 這些建構函式會將 Proxy 建立設定為 false 並註冊 ObjectMaterializedEventHandler。 如需 POCO (「單純」的 CLR 物件) 和 Proxy 物件的詳細資訊,請參閱Working with POCO Entities

    • ObjectSet 屬性。

    • 函式匯入方法 (如果已在概念模型中定義任何方法的話)。

  • 名為 <模型名稱>.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 Form、WPF 和 Silverlight 中支援雙向資料繫結) 的部分類別。

      DataContract 屬性加入至類別的頂端,以便允許序列化此類別。 此外,還會針對 DataContract 屬性指定 IsReference = true。 這表示這種型別的序列化是深層序列化。

      KnownType 屬性會加入至類別的頂端。 這個實體類型具有導覽屬性 (Property) 的每個型別都有一個 KnownType 屬性 (Attribute)。

      實體類別的定義包括:基本屬性、複雜屬性、導覽屬性、ChangeTracker 屬性,以及可協助進行關聯性同步處理邏輯的方法。

    • 複雜類型是實作 INotifyComplexPropertyChangingINotifyPropertyChanged 的部分類別。

自訂物件層程式碼

若要自訂物件層程式碼的產生方式,您必須修改 .tt 檔案。 您可能會想要修改具型別物件內容的名稱、針對實體類型新增或修改現有的屬性 (Property) 或屬性 (Attribute),或是讓實體類型繼承自某個介面。

若要自訂物件層程式碼,請修改 .tt 檔案中的文字區塊。 文字區塊會定義於 <##> 標記外部。 若要變更具型別物件內容的名稱,請開啟 <模型名稱>.Context.tt 檔案,然後在所有 <#=code.Escape(container)#> 的相符項目前面加入文字 (例如 My)。 接著,如果在 .edmx 檔案中,容器的名稱為 SchoolEntities,則在產生的程式碼中,容器的名稱就是 MySchoolEntities.

如需詳細資訊,請參閱 HOW TO:產生自訂物件層程式碼 (實體資料模型設計工具)

另請參閱

概念

Entity Framework 公用程式 .ttinclude 檔案

其他資源

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