2014-06-05 2 views
1

나는 서버 측 부분과 클라이언트 측 부분을 가진 어플리케이션을 가지고있다. 서버 측 부분은 WebApi2 및 EF6로 구현되며 serializer로 Json 및 Protobuf를 사용합니다. 따라서 [DataMember]를 내 모델 속성의 특성으로 사용합니다. 여기서는 Protobuf serialiser 때문에 [DataMember (Order = number)] 속성에 순서를 지정해야합니다.T4에서 edmx의 DataMember 속성 읽기

제 서버 측 모델 (codefirst)에서 모델 정보를 보유하고있는 edmx 파일을 생성합니다. 클라이언트 측에서는 edmx 파일을 사용하는 t4 템플릿으로이 모델을 생성합니다. Protobuf를 사용하기 전에 DataMember 속성을 잘 작동하는 t4 템플릿의 모든 속성 위에 둡니다. 하지만 이제 Protobuf와 작동하도록 서버에서와 동일한 주문을 사용해야합니다. 즉, edmx에서 DataMember 특성을 읽고 Order 값을 찾아야합니다. 그러나 나는 그 속성을 읽을 수 없다.

은 내가

edmProperty.TypeUsage.Facets 

이 객체에 대한 몇 가지 다른 속성을 읽으려고. 나는 또한 Google에서 검색 한 t4 템플릿에 대한 몇 가지 sampleprojects보세요. 그러나 운이 없다.

그래서 속성의 순서는 어떻게 읽을 수 있습니까?

MyServerModel 
{ 
[DataMember(Order=1)] //this number of the order is what I'm looking for 
MyProperty{get;set;} 
} 

이제 T4의 마법을 사용하고 edmx 파일의 도움으로 다음을 생성하십시오. 모든 회원이 DataMember를 속성 때문에

MyClientModel 
{ 
[DataMember(Order=1)] //I want to generate this Attribute with the t4 template from 
         //the edmx file 
MyProperty{get;set;} 
} 

답변

1

은 DataMember 속성은 edmx 파일의 일부가 아닙니다. 그리고이 결과로 주문 정보가 손실됩니다. 다음과 같은 방법으로이 문제를 해결했습니다. 먼저 edmx 파일 normaly를 생성합니다. 이후 우리는 수동으로 구문 분석하고 EntityType 항목을 찾습니다. 그런 다음 첫 번째 모델이 상주하는 어셈블리에서 리플렉션을 사용하여 유형을로드합니다. CustomAttributes를 구문 분석하여 Order를 읽을 수있는 DateMemberAttribute를 찾습니다. 이 정보를 얻은 후에는 edmx 파일에 문서 태그 (매우 우아하지 않음)에 넣거나 Property/NavigationProperty 태그를 사용자 정의 주석으로 추가하여이 정보를 edmx 파일에 쓸 수 있습니다. 이 우리의 edmx 속성 태그 후

이에 유사 :이 정보를 다시 edmx 파일을 구문 분석해야하고 순서로 DataMember를 주석을 쓸 수 T4 템플릿 스크립트에서
<Property Name="PropertyName" Type="Guid" xmlns:d2p8:DataMemberOrder="5" xmlns:d2p8="http://www.yourcompany.com/customAnnotation" /> 

.