【问题标题】:Adding arbitrary data to OData metadata in WebAPI?将任意数据添加到 WebAPI 中的 OData 元数据?
【发布时间】:2018-12-06 10:49:36
【问题描述】:

我有一个使用 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 展示了如何向实体添加实例注释。关闭,但不完全是我想要的,所以现在我试图找到一种方法来扩展以类似方式生成元数据文档的任何内容。

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    我想出了一个办法。下面的代码添加自定义命名空间前缀“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 我已经使用了这个实现并且效果很好,我遇到了一个问题,我想在 上添加一个自定义属性。这可能吗?尝试删除 .FindProperty("RevisionDate")。
    【解决方案2】:

    您可以将自定义属性设置为任何 IEdmEntityType,因此也可以为 .简单修改kenchilada的代码如下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-11
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      • 2013-09-01
      • 1970-01-01
      相关资源
      最近更新 更多