ADO.NET EntityObject 생성기 템플릿
이 항목에서는 Visual Studio 2010에 포함된 ADO.NET EntityObject 생성기 템플릿에 대해 간략하게 설명합니다. 또한 텍스트 템플릿을 사용자 지정하는 방법도 보여 줍니다. ADO.NET EntityObject 생성기 템플릿은 형식화된 ObjectContext 및 EntityObject 파생 엔터티 클래스(개체 계층 코드)를 생성합니다.
ADO.NET EntityObject 생성기 템플릿은 Entity Designer에서 생성된 기본 코드와 동일한 코드를 생성하며 <model name>.tt라는 텍스트 템플릿 파일로 구성되어 있습니다. <model name>.tt 템플릿은 솔루션 탐색기에서 <model name>.tt 아래에 나타나는 <model name>.cs(또는 .vb)라는 소스 파일을 출력합니다.
<model name>.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 case)가 필드 이름에 사용되는지 여부나 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 파일에 정의된 도우미 클래스를 인스턴스화하고 초기화합니다. 일부 로컬 변수도 초기화됩니다.
<#
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 도우미 함수에서 반환하는 메타데이터 정보를 기반으로 텍스트를 작성합니다. GetSourceSchemaTypes 도우미 함수는 <model name>.tt 파일에 정의되어 있으며 GetItems 메서드를 호출하여 이 항목 컬렉션에서 지정된 형식의 항목을 모두 가져옵니다. <model name>.cs 또는 <model name>.vb 파일에 작성되는 코드에 대한 설명은 다음과 같습니다.
EDM 관계 메타데이터
형식화된 ObjectContext 정의. 클래스 정의에는 생성자 오버로드, ObjectSet 속성, AddTo 메서드(UserSettings.CreateContextAddToMethods가 true로 설정된 경우) 및 Function Import 메서드(개념적 모델에서 정의된 경우)가 포함됩니다.
<model name>.tt 파일의 다음 코드에서는 형식화된 ObjectContext 클래스를 작성합니다.
<#=Accessibility.ForType(container)#> Partial Class <#=code.Escape(container)#> Inherits ObjectContext
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : ObjectContext
컨테이너 이름이
SchoolEntities
인 경우 다음 코드가 <model name>.cs 또는 <model name>.vb 파일에 생성됩니다.Public Partial Class SchoolEntities Inherits ObjectContext
public partial class SchoolEntities : ObjectContext
엔터티 형식 클래스. 이러한 클래스는 EntityObject에서 파생되며 개체 계층의 엔터티 형식이 개념적 모델의 엔터티 형식에 매핑되는 방법을 정의하는 특성을 포함합니다. 엔터티 클래스의 정의에는 팩터리 메서드와 기본 속성, 복합 속성 및 탐색 속성이 포함됩니다.
복합 형식 클래스. 이러한 클래스는 ComplexObject에서 파생되며 개체 계층의 복합 형식이 개념적 모델의 복합 형식에 매핑되는 방법을 정의하는 특성을 포함합니다.
그런 다음 도우미 함수가 정의됩니다. 텍스트 템플릿에서 도우미 함수는 클래스 기능 블록으로 묶입니다. <#+ 및 **#>**을 사용하여 클래스 기능 태그를 표시합니다.
개체 계층 코드 사용자 지정
개체 계층 코드가 생성되는 방법을 사용자 지정하려면 .tt 파일을 수정해야 합니다. 형식화된 개체 컨텍스트의 이름을 수정할 수 있습니다. 즉, 엔터티 형식의 새 속성 또는 특성을 추가하거나 기존 속성 또는 특성을 수정할 수 있으며 엔터티 형식이 일부 인터페이스에서 상속하게 할 수 있습니다. 개체 계층 코드를 사용자 지정하려면 .tt 파일에서 텍스트 블록(<# 및 #> 태그 밖에 있음)을 수정하면 됩니다.
형식화된 개체 컨텍스트의 이름을 변경하려면 모든 <#=code.Escape(container)#>
앞에 단어(예: My
)를 추가합니다. 이렇게 하면 .edmx 파일에서 컨테이너 이름이 SchoolEntities
인 경우 생성된 코드에서 컨테이너 이름은 MySchoolEntities
가 됩니다.
UserSettings 형식의 필드 값을 변경하여 생성된 코드를 사용자 지정할 수도 있습니다. 예를 들어, 생성된 코드에 정규화된 시스템 형식이 없도록 하려면 FullyQualifySystemTypes
를 false로 설정합니다.
자세한 내용은 방법: 개체 계층 코드 생성 사용자 지정(엔터티 데이터 모델 디자이너)을 참조하십시오.