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

8
我有一个简单的WebAPI2服务,使用OData(System.Web.Http.OData,5.1.0.0)。用户可以访问/odata/$metadata获取可用的实体和属性。我希望扩展此元数据以添加其他信息,例如将“显示名称”值添加到属性中。
我发现有关“注释”的信息,听起来像是我想要的东西,但我找不到任何解释如何在我的情况下使用它,或者是否可能使用它。我尝试执行以下操作:
model.SetAnnotationValue(((IEdmEntityType)m.FindType("My.Thing")).FindProperty("SomeProperty"),
       namespaceName:"MyNamespace",
       localName: "SomeLocalName",
       value: "THINGS");

类型/属性名称正确,调用成功,但OData EDMX文档不包含此注释。是否有一种方法可以公开这些注释或以其他方式实现我想要的功能?
更新: 仍在进行中。我一直在研究ODataMediaTypeFormatters作为处理此问题的可能方法。有一个ASP.NET示例项目(链接)展示了如何向实体添加实例注释。接近,但不完全是我想要的,所以现在我正在尝试以类似的方式扩展生成元数据文档的任何内容。
2个回答

13

我找到了一种方法来做这件事。下面的代码添加了一个自定义的命名空间前缀"myns",然后在模型属性上添加了一个注释:

我想出了一种方法,下面的代码会添加一个自定义命名空间前缀 "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>

@raddium 我使用过这个实现,它完美地运行着。我遇到了一个问题,即我想在<EntityType Name="Person">上添加自定义属性。这可能吗?我尝试删除.FindProperty("RevisionDate"),但未成功。 - Shivkumar

-1

您可以为任何IEdmEntityType设置自定义属性,因此也适用于。只需按照kenchilada的代码进行修改:

m.SetAnnotationValue(m.FindType(type), namespaceName, localName, value);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接