在WebAPI中向OData元数据添加任意数据?

ken*_*ada 7 odata asp.net-web-api

我有一个使用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");
Run Code Online (Sandbox Code Playgroud)

类型/属性名称正确并且调用成功,但OData EDMX文档不包含此批注.有没有办法公开这些注释或以其他方式做我想要的?

更新:
还在.我一直在寻找ODataMediaTypeFormatters一种可能的方法来处理这个问题.有一个ASP.NET示例项目,显示如何向实体添加实例注释.关闭,但不完全是我想要的,所以现在我试图找到一种方法来扩展任何生成元数据文档的方式.

ken*_*ada 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);
Run Code Online (Sandbox Code Playgroud)

请求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>
Run Code Online (Sandbox Code Playgroud)