【问题标题】:How to expand navigation properties on POST/PUT OData request如何在 POST/PUT OData 请求上扩展导航属性
【发布时间】:2020-08-31 15:01:22
【问题描述】:

我正在使用 OData ASP.NET Core 7.4.1

例如,通过请求GET https://localhost:44346/api/v1/estates/74EEAB44-B8E7-EA11-B361-D43B04C15376?$expand=tenants,我可以得到一个信息为tenants的实体

{
    "@odata.context": "https://localhost:44346/odata/v1/$metadata#Estates(tenants(),tenants())",
    "value": [
        {            
            "updatedOn": "2020-08-26T16:22:01.03+02:00",
            "tenants": [
                {
                    "name": "tenant"
                }
            ]
        }
    ]
}

但是通过 Put 请求 PUT https://localhost:44346/odata/v1/estates(74EEAB44-B8E7-EA11-B361-D43B04C15376)?$expand=tenants ,我可以获得返回的实体但没有 tenants

{
    "@odata.context": "https://localhost:44346/odata/v1/$metadata#Estates(tenants(),tenants())",
    "value": [
        {            
            "updatedOn": "2020-08-26T16:22:01.03+02:00",
            "tenants": []
        }
    ]
}

问题:如何在PUT 请求中返回返回实体的tenants,因为我不想对服务器进行GET(id) 调用以刷新创建/更新的实体。服务器应返回与GET(id) 完全相同的实体表示。

有一个关于此问题的ticket 打开但未解决。有人解决了这个问题吗?

【问题讨论】:

  • 嗨,@Antoine V,HttpPut 在我的 Odata 上工作。你能分享一下你的 HTTP PUT 方法吗?
  • 是的,您需要共享处理 PUT 的控制器方法,您从该方法使用的响应机制决定了响应如何以及是否使用 tenants 导航数据序列化

标签: c# asp.net-core odata asp.net-core-3.1


【解决方案1】:

这是 Startup.cs 中的设置

        app.UseMvc(routeBuilder =>
        {
            routeBuilder.EnableDependencyInjection();
            routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(10).Count();

            var builder = new ODataConventionModelBuilder(app.ApplicationServices);
            builder.EntitySet<Tenants>("estates");
            routeBuilder.MapODataServiceRoute("ODataRoute", "odata/v1", builder.GetEdmModel());
        });

模式代码

public class Tenants
{
    public int id { get; set; }
    public DateTime updatedOn { get; set; }
    public List<Tenant> tenants { get; set; }
}

public class Tenant
{
    public string name { get; set; }
}

HTTP 获取

    [HttpGet]
    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
    public async Task<IActionResult> Get()
    {
        var tenants = (await dataProvider.GetTenants()).ToList();
        return Ok(tenants);
    }

HTTP 放置

    [HttpPut("{key}")]
    [ODataRoute("{key}")]
    [EnableQuery]
    public async Task<IActionResult> ([FromODataUri] Guid key, [FromBody] Estate estate)
    {
        var tenants = (await dataProvider.SetTenants(name)).ToList();
        return Ok(tenants);
    }

【讨论】:

  • 我编辑了你的帖子,但你的想法帮助我使代码工作
猜你喜欢
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多