c# - 如何在 POST/PUT OData 请求上扩展导航属性

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

我正在使用 OData ASP.NET Core 7.4.1

例如,请求 GET https://localhost:44346/api/v1/estates/74EEAB44-B8E7-EA11-B361-D43B04C15376?$expand=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 ,我可以得到我的返回实体但没有租户

{
    "@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打开了这个但没有解决。有人解决了这个问题吗?

最佳答案

这里是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);
    }

enter image description here

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);
    }

enter image description here

关于c# - 如何在 POST/PUT OData 请求上扩展导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63673270/

相关文章:

c# - C# 中的接口(interface)和后期绑定(bind)

c# - Azure Web App 中的 SignalR 连接限制

c# - 在 ASP.Core MVC 中使用用户名和密码设置连接字符串

.net - .Net Core 中可变数量的 Oauth 身份验证方案

javascript - 动态添加按钮省略确认

c# - 如何获得类型的类

c# - Entity Framework 继承映射 (TPH)

c# - .Net Core 2.2 中的 OData : how to get total number of items?

javascript - 如何在 CRM 2011 中使用 Javascript 和 oData 获取 PartyList 字段的值

c# - Azure 网站上的 Odata/Web Api 错误 "Make sure that the controller has a parameterless public constructor"