我有一个使用OData(System.Web.Http.OData
,5.1.0.0)的简单WebAPI2服务。用户可以点击/odata/$metadata
以获取可用的实体和属性。我正在寻找一种方法来扩展这个元数据与附加信息,例如向属性添加“显示名称”值。
我发现有关“注释”的信息听起来像是我想要的,但我找不到任何解释如何在我的场景中使用它或者甚至是可能的。我试图做类似以下的事情:
model.SetAnnotationValue(((IEdmEntityType)m.FindType("My.Thing")).FindProperty("SomeProperty"),
namespaceName:"MyNamespace",
localName: "SomeLocalName",
value: "THINGS");
类型/属性名称正确且调用成功,但OData EDMX文档不包含此批注。有没有办法公开这些注释或以其他方式做我想要的?
更新:
仍然在它。我一直在寻找ODataMediaTypeFormatters
作为处理这个问题的可行方法。有一个ASP.NET sample project显示了如何向实体添加实例注释。关闭,但不完全是我想要的,所以现在我试图找到一种方法来扩展以类似的方式生成元数据文档。
答案 0 :(得分:12)
我找到了一种方法来做到这一点。下面的代码添加了自定义命名空间前缀“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>
答案 1 :(得分:-1)
您可以将自定义属性设置为任何IEdmEntityType,也可以设置为。只需按以下步骤修改kenchilada的代码:
m.SetAnnotationValue(m.FindType(type), namespaceName, localName, value);