2010-05-31 7 views
3

T4를 사용하여 클래스 정의를 생성하고 필드 이름 앞에 밑줄이 표시되는지 확인합니다.밑줄이없는 camelCase의 T4 FieldName?

나는 여전히 _myField보다는 myField와 끝까지 (I 그 기본의 이해에도 불구하고) 안전을 위해

code.CamelCaseFields = true; 

을 설정했습니다.

어떻게 '_'문자없이 필드 이름을 생성 할 수 있습니까?

또한 T4의 설명서는 어디에 있습니까?

Code Generation and Text Templates과 같은 많은 리소스를 찾고 있지만 클래스 별 속성 별 속성 설명서를 찾지 못했습니다.

답변

3

아마도 EF4 셀프 추적 엔티티에 대해 이야기하고있을 것입니다. CodeGenerationTools 클래스는 <#@ include file="EF.Utility.CS.ttinclude"#> 지시문을 통해 포함되며 "[VSInstallDir] \ Common7 \ IDE \ Extensions \ Microsoft \ Entity Framework Tools \ Templates \ Includes \ EF.Utility.CS.ttinclude"에서 찾을 수 있습니다.

도 fieldName 기능 등으로 정의된다 :

private string FieldName(string name) 
{ 
    if (CamelCaseFields) 
    { 
    return "_" + CamelCase(name); 
    } 
    else 
    { 
    return "_" + name; 
    } 
} 

는 "_"은 함수에 하드 코딩되어있다. 자신 만의 코딩은 어렵지 않아야합니다. CodeGenerationTools 클래스는이 ttinclude 파일에만 해당되며 T4에서 코드를 생성하는 일반적인 방법은 아닙니다.

2

첫 번째 문자를 대문자로 만들고 공백/밑줄을 제거하고 다음 문자를 대문자로 만드는 방법을 작성했습니다. 아래 샘플을 참조하십시오. 부담없이 사용하십시오.

private string CodeName(string name) 
{ 
    name = name.ToLowerInvariant(); 

    string result = name; 
    bool upperCase = false; 

    result = string.Empty; 
    for (int i = 0; i < name.Length; i++) 
    { 
     if (name[i] == ' ' || name[i] == '_') 
     { 
      upperCase = true; 
     } 
     else 
     { 
      if (i == 0 || upperCase) 
      { 
       result += name[i].ToString().ToUpperInvariant(); 
       upperCase = false; 
      } 
      else 
      { 
       result += name[i]; 
      } 
     } 
    } 

    return result; 
} 

입력/출력 샘플 : FIRST_NAME = FIRSTNAME, ID = 아이디, 상태 메시지 = 상태 메시지

0

이, 그러나 그것은 적절한 장소가 넣어 WHERE 알고에 도움이되지 않습니다 좋은 조언이다 그러한 기능은 ...

EF .tt 파일을 DECOMPOSING하거나 출력 생성을 단계별로 실행하여 출력을 빌드하는 방법에 대한 지침이 있습니까?

나는 라인 출력에 사용되는 표시 (Ef4.3)라는 함수

공공 문자열 속성 (EdmProperty edmProperty)

로 연결하여 성공적으로 위의 기능을 사용할 수 있었다 같은 "공공 INT의 필드 이름 {얻을; 설정;}"

을이 같은 이름을 수정하는 기능을 포장하기 위해 형식화하는로 (인덱스 {2}) PARAM을 3 변경 :

_typeMapper.GetTypeName(edmProperty.TypeUsage), //unchanged 
UnderScoreToPascalCase(_code.Escape(edmProperty)), //wrapped "name" 
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)), // unchanged 

이것은 완벽하지 않습니다. 예 : 기존 "Ucasing"을 유지하지 않고 다음과 같은 사항에 신경 쓰지 마십시오. customerIP outputs : Customerip IMO는별로 읽을 수 없습니다 ...

데이터베이스가 낙타의 혼란에 빠져 있었기 때문에 악몽이었던 것보다 나을 것 같습니다. 파스칼 케이스와 언더 스코어 분리가 너무 끔찍했습니다.

어쨌든 이것은 누군가에게 도움이되기를 바랍니다.