ADO.NET EntityObject Generator 範本
本主題將提供隨附於 Visual Studio 2010 之 [ADO.NET EntityObject Generator] 範本的概觀。本主題也將示範如何自訂文字範本。 [ADO.NET EntityObject Generator] 範本會產生具型別的 ObjectContext 和 EntityObject 衍生實體類別 (物件層程式碼)。
[ADO.NET EntityObject Generator] 範本所產生的程式碼與 Entity Designer 所產生的預設程式碼相同。 [ADO.NET EntityObject Generator] 範本包含一個文字範本檔案:<模型名稱>.tt。 <模型名稱>.tt 範本會輸出一個原始程式檔 <模型名稱>.cs (或 .vb),而這個檔案會出現在 [方案總管] 中的 <模型名稱>.tt 底下。
<模型名稱>.tt 檔案程式碼概觀
首先,程式碼會使用內建的指示詞來指示文字範本處理引擎如何處理範本。 此文字範本包括 .ttinclude 檔案,其中包含可協助進行程式碼產生處理序的公用程式類別。 如需 .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"#>
然後,它會建立 UserSettings 型別的執行個體,讓使用者指定程式碼的寫出方式。 例如,這個型別會決定欄位名稱是否要使用 Camel 大小寫,或者是否要將 AddTo 方法加入至產生之程式碼中的具型別物件內容類別。
<#
Dim userSettings As UserSettings =
New UserSettings With _
{ _
.SourceCsdlPath = "SchoolModel.edmx", _
.ReferenceCsdlPaths = new string () {}, _
.FullyQualifySystemTypes = True, _
.CreateContextAddToMethods = True, _
.CamelCaseFields = False _
}
ApplyUserSettings(userSettings)
#>
<#
UserSettings userSettings =
new UserSettings
{
SourceCsdlPath = @"SchoolModel.edmx",
ReferenceCsdlPaths = new string[] {},
FullyQualifySystemTypes = true,
CreateContextAddToMethods = true,
CamelCaseFields = false,
};
ApplyUserSettings(userSettings);
#>
然後,程式碼會具現化並初始化 .ttinclude 檔案中定義的 Helper 類別。 某些區域變數也會一併初始化。
<#
Dim loader As New MetadataLoader(Me)
Dim ef As New MetadataTools(Me)
Dim region As New CodeRegion(Me)
Dim code As New CodeGenerationTools(Me) With {.FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, .CamelCaseFields = userSettings.CamelCaseFields}
ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray())
ModelNamespace = loader.GetModelNamespace(SourceCsdlPath)
Dim namespaceName As String = code.VsNamespaceSuggestion()
UpdateObjectNamespaceMap(namespaceName)
#>
<#
MetadataLoader loader = new MetadataLoader(this);
MetadataTools ef = new MetadataTools(this);
CodeRegion region = new CodeRegion(this);
CodeGenerationTools code = new CodeGenerationTools(this){FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, CamelCaseFields = userSettings.CamelCaseFields};
ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray());
ModelNamespace = loader.GetModelNamespace(SourceCsdlPath);
string namespaceName = code.VsNamespaceSuggestion();
UpdateObjectNamespaceMap(namespaceName);
#>
初始化之後,就會混合使用文字區塊與程式碼區塊來產生輸出檔案的文字。 系統會使用 foreach (Visual Basic 中的 For Each) 迴圈來寫出以 GetSourceSchemaTypes Helper 函式所傳回之中繼資料資訊為基礎的文字。 GetSourceSchemaTypes Helper 函式會定義於 <模型名稱>.tt 檔案中,而且它會呼叫 GetItems 方法,從這個項目集合中取得指定之型別的所有項目。 下面是寫出至 <模型名稱>.cs 或 <模型名稱>.vb 檔案之程式碼的說明:
EDM 關聯性中繼資料。
具型別的 ObjectContext 定義。 此類別定義包括:建構函式多載、ObjectSet 屬性、AddTo 方法 (如果 UserSettings.CreateContextAddToMethods 設定為 true 的話) 和函式匯入方法 (如果已在概念模型中定義任何方法的話)。
<模型名稱>.tt 檔案中的下列程式碼會寫出具型別的 ObjectContext 類別。
<#=Accessibility.ForType(container)#> Partial Class <#=code.Escape(container)#> Inherits ObjectContext
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : ObjectContext
如果容器名稱為
SchoolEntities
,就會在 <模型名稱>.cs 或 <模型名稱>.vb 檔案中產生下列程式碼:Public Partial Class SchoolEntities Inherits ObjectContext
public partial class SchoolEntities : ObjectContext
實體類型類別。 這些類別衍生自 EntityObject 而且包括一些屬性,其中定義物件層中的實體類型如何對應至概念模型中的實體類型。 實體類別的定義包括 Factory 方法以及基本、複雜和導覽屬性。
複雜類型類別。 這些類別衍生自 ComplexObject 而且包括一些屬性,其中定義物件層中的複雜類型如何對應至概念模型中的複雜類型。
然後,定義 Helper 函式。 在文字範本中,Helper 函式會用類別功能區塊括住。 您可以使用 <#+ 和 #> 來表示類別功能標記。
自訂物件層程式碼
如果您想要自訂物件層程式碼的產生方式,就必須修改 .tt 檔案。 您可能會想要修改具型別物件內容的名稱、針對實體類型新增或修改現有的屬性 (Property) 或屬性 (Attribute),或是讓實體類型繼承自某個介面。 若要自訂物件層程式碼,您可以修改 .tt 檔案中的文字區塊 (文字區塊位於 <# 和 #> 標記外部)。
若要變更具型別物件內容的名稱,請在所有 <#=code.Escape(container)#>
的相符項目前面加入文字 (例如 My
)。 接著,如果在 .edmx 檔案中,容器的名稱為 SchoolEntities
,則在產生的程式碼中,容器的名稱就是 MySchoolEntities.
。
您也可以透過變更 UserSettings 型別的欄位值,自訂產生的程式碼。 例如,如果您不想讓產生的程式碼具有完整的系統型別,請將 FullyQualifySystemTypes
設定為 false。
如需詳細資訊,請參閱 HOW TO:產生自訂物件層程式碼 (實體資料模型設計工具)。