【问题标题】:Navigation Property does not reflect导航属性不反映
【发布时间】:2014-05-15 16:20:30
【问题描述】:

我拥有的导航属性不会反映在我的 odata 结果上,但我正在为该属性分配值。这是代码。

for (var x = 1; x <= 5; x++)
            {
                var mainEntity = new EdmEntityObject(entityType);
                mainEntity.TrySetPropertyValue("Id", "AllKey" + x.ToString());
                mainEntity.TrySetPropertyValue("UserName", "AccountId" + x.ToString());
                mainEntity.TrySetPropertyValue("EmailAddress", "EmailAddress@EmailAddress.com" + x.ToString());
                mainEntity.TrySetPropertyValue("FirstName", "FirstName" + x.ToString());
                mainEntity.TrySetPropertyValue("LastName", "LastName" + x.ToString());
                mainEntity.TrySetPropertyValue("Custom", "Custom" + x.ToString());
                mainEntity.TrySetPropertyValue("[BasicProperty]Id", "[BasicProperty]Id" + x.ToString());

                IEdmEntityTypeReference categoryType = entityType.FindNavigationProperty("UserLogin").Type.AsEntity();

                var mainEntity2 = new EdmEntityObject(categoryType);
                mainEntity2.TrySetPropertyValue("Id", "AllKey" + x.ToString());
                mainEntity2.TrySetPropertyValue("UserName", "AccountId" + x.ToString());
                mainEntity2.TrySetPropertyValue("EmailAddress", "EmailAddress@EmailAddress.com" + x.ToString());
                mainEntity2.TrySetPropertyValue("FirstName", "FirstName" + x.ToString());
                mainEntity2.TrySetPropertyValue("LastName", "LastName" + x.ToString());

                mainEntity.TrySetPropertyValue("UserLogin", mainEntity2);                    

                collectionProduct.Add(mainEntity);
            }

这是结果。

{

"@odata.context": "http://localhost/WebApi/enwisen/User_Entity/$metadata#User_Entity",
"value": [
    {
        "UserName": "AccountId1",
        "EmailAddress": "EmailAddress@EmailAddress.com1",
        "Id": "AllKey1",
        "FirstName": "FirstName1",
        "LastName": "LastName1",
        "Custom": "Custom1"
    },
    {
        "UserName": "AccountId2",
        "EmailAddress": "EmailAddress@EmailAddress.com2",
        "Id": "AllKey2",
        "FirstName": "FirstName2",
        "LastName": "LastName2",
        "Custom": "Custom2"
    },
    {
        "UserName": "AccountId3",
        "EmailAddress": "EmailAddress@EmailAddress.com3",
        "Id": "AllKey3",
        "FirstName": "FirstName3",
        "LastName": "LastName3",
        "Custom": "Custom3"
    },
    {
        "UserName": "AccountId4",
        "EmailAddress": "EmailAddress@EmailAddress.com4",
        "Id": "AllKey4",
        "FirstName": "FirstName4",
        "LastName": "LastName4",
        "Custom": "Custom4"
    },
    {
        "UserName": "AccountId5",
        "EmailAddress": "EmailAddress@EmailAddress.com5",
        "Id": "AllKey5",
        "FirstName": "FirstName5",
        "LastName": "LastName5",
        "Custom": "Custom5"
    }
]

}

这是元数据

<EntityType Name="User">
<Key>
   <PropertyRef Name="Id"/>
</Key>
<Property Name="UserName" Type="Edm.String"/>
<Property Name="EmailAddress" Type="Edm.String"/>
<Property Name="Id" Type="Edm.String"/>
<Property Name="FirstName" Type="Edm.String"/>
<Property Name="LastName" Type="Edm.String"/>
<Property Name="Custom" Type="Edm.String"/>
<NavigationProperty Name="GroupLookup" Type="Collection(Enwisen.GroupLookup)"/>
<NavigationProperty Name="UserLogin" Type="Enwisen.UserLogin" Nullable="false/>
</EntityType>

请注意,我有一个导航属性,但它不会反映结果。

【问题讨论】:

    标签: c# asp.net-web-api odata


    【解决方案1】:

    您似乎将 GET 请求编写为

    http://localhost/WebApi/enwisen/User_Entity/User_Entity
    

    您需要按如下方式编写查询:

    http://localhost/WebApi/enwisen/User_Entity/User_Entity?$expand=UserLogin
    

    因此,导航属性将显示在响应负载中。

    OData 协议参考:11.2.4.2 System Query Option $expand.

    【讨论】:

    • 返回当我使用 wcf 数据服务 odata 时,即使我没有使用展开,导航属性也会出现。它有一个与之关联的链接。我不知道 web api 是否有不同的行为。
    • WCF 数据服务返回的默认负载类型是 Atom。导航属性的关联链接和导航链接默认包含在 Atom 有效负载中。我认为您的 Web API 服务返回的有效负载可能是 JSON 有效负载。对于 V3 OData 服务,要在 JSON 负载中包含导航链接,您可以将负载请求为 localhost/WebApi/enwisen/User_Entity/…。对于 V4 服务,您应该请求localhost/WebApi/enwisen/User_Entity/…
    • 太棒了!我现在可以看到导航属性。谢谢@丁毅
    • 如果我返回像 IEdmEntityObject 这样的单个结果但当我返回集合时它会抛出错误“'ObjectContent`1'类型无法序列化内容的响应正文输入'application/json; odata.metadata=full; charset=utf-8'。”。知道这里有什么问题吗?
    • 你或许可以参考这个问题来回答:stackoverflow.com/questions/17154475/…
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2022-01-22
    相关资源
    最近更新 更多