2014-03-05 32 views
6

我有一個使用OData的(System.Web.Http.OData,5.1.0.0)一個簡單的WebAPI2服務。用戶可以點擊/odata/$metadata獲取可用的實體和屬性。我正在尋找一種方式來擴展這些元數據的附加信息,比如將「顯示名稱」值添加到屬性中。將任意數據添加到WebAPI中的OData元數據中?

我發現有關這聽起來像它就是我想要的「註釋」,但我無法找到任何explanining如何在我的情況下使用,或者如果它甚至有可能。我試圖做類似如下:

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我有使用此實施,它完美的作品,我面臨的一個問題,我想在<的EntityType名稱=「人」>添加自定義屬性。這可能嗎?嘗試通過刪除.FindProperty(「RevisionDate」)。 – Shivkumar