2014-03-05 1 views
6

OData (System.Web.Http.OData, 5.1.0.0)를 사용하는 간단한 WebAPI2 서비스가 있습니다. 사용자는 /odata/$metadata을 눌러 사용 가능한 엔티티 및 속성을 가져올 수 있습니다. 속성에 "표시 이름"값을 추가하는 것과 같은 추가 정보를 사용하여이 메타 데이터를 확장하는 방법을 찾고 있습니다.WebAPI의 OData 메타 데이터에 임의의 데이터 추가 중?

내가 원했던 것처럼 들리는 "주석"에 대한 정보를 찾았지만 내 시나리오에서 이것을 사용하는 방법을 설명하는 것이나 심지어 가능할 때도 찾을 수 없습니다. 나는 다음과 같은 일을하려고했다 :

model.SetAnnotationValue(((IEdmEntityType)m.FindType("My.Thing")).FindProperty("SomeProperty"), 
     namespaceName:"MyNamespace", 
     localName: "SomeLocalName", 
     value: "THINGS"); 

유형/속성 이름이 올바른지 확인하고 통화는 성공하지만, 하나로, OData EDMX 문서는이 주석이 포함되어 있지 않습니다. 이러한 주석을 노출하거나 내가 원하는 것을 수행 할 수있는 방법이 있습니까?

업데이트 :
여전히 그렇습니다. 이 문제를 해결할 수있는 방법은 ODataMediaTypeFormatters입니다. 엔터티에 인스턴스 주석을 추가하는 방법을 보여주는 ASP.NET sample project이 있습니다. 가까운,하지만 정확히 내가 원하는, 그래서 지금 나는 비슷한 방식으로 메타 데이터 문서를 생성하는 모든 것을 확장하는 방법을 찾으려고 노력하고있어.

답변

9

나는 이것을하는 방법을 알아 냈습니다. 아래의 코드는 사용자 정의 네임 스페이스 접두사 "myns"을 추가하고 모델 속성에 주석을 추가합니다

const string namespaceName = "http://my.org/schema"; 
var type = "My.Domain.Person"; 
const string localName = "MyCustomAttribute"; 

// this registers a "myns" namespace on the model 
model.SetNamespacePrefixMappings(new [] { new KeyValuePair<string, string>("myns", namespaceName), }); 

// set a simple string as the value of the "MyCustomAttribute" annotation on the "RevisionDate" property 
var stringType = EdmCoreModel.Instance.GetString(true); 
var value = new EdmStringConstant(stringType, "BUTTONS!!!"); 
m.SetAnnotationValue(((IEdmEntityType) m.FindType(type)).FindProperty("RevisionDate"), 
         namespaceName, localName, value); 

당신에게 같은 것을 제공한다 하나로, OData 메타 데이터 문서를 요청 : 내가 가지고

<edmx:Edmx Version="1.0"> 
    <edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0"> 
     <Schema Namespace="My.Domain"> 
      <EntityType Name="Person"> 
       <Key><PropertyRef Name="PersonId"/></Key> 
       <Property Name="RevisionDate" Type="Edm.Int32" Nullable="false" myns:MyCustomAttribute="BUTTONS!!!"/> 
     </Schema> 
    </edmx:DataServices> 
</edmx:Edmx> 
+0

@raddium을 이 구현을 사용하고 완벽하게 작동하지만, 에 사용자 지정 특성을 추가하려는 문제에 직면하고 있습니다. 이것이 가능한가? .FindProperty ("RevisionDate")를 제거하여 시도했습니다. – Shivkumar

관련 문제