【问题标题】:Adding Child to an existing parent in Webapi odata controller将子级添加到 Webapi odata 控制器中的现有父级
【发布时间】:2017-01-20 03:41:37
【问题描述】:

我使用带有 EF6 的 Odata Webapi,我的模型如下

public class Company
{

Public Company()
{
Products = new List<Product>();

}
[Key]
public int Id { get; set; }

[Required]
public string Name { get; set; }

public List<Product> Products { get; set; }
}
public class Product
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

}

我需要公开一个端点以将产品添加到现有公司。 终点必须如下所示。

Post: ~odata/Company(1)/Products with body as List of products json.
body:[{"Name":"Product1"},{"Name":"Product2"}]

【问题讨论】:

    标签: post asp.net-web-api entity-framework-6 odata


    【解决方案1】:

    我建议为此使用绑定的 ODataAction。 您需要传入一个包含产品列表的 DTO。

    DTO 的一个例子是:

    public class CreateProductsDTO
    {
     List<Product> Products { get; set; }
    }
    

    那么您需要向公司控制器注册一个绑定操作:

    var action = builder.EntityType<Company>().Action("AddProducts");
    action.Parameter<CreateProductsDTO>("Value");
    

    在控制器中你需要定义一个动作,比如:

    [HttpPost]
    public async Task<IHttpActionResult> AddProducts([FromODataUri] Guid key, ODataActionParameters parameters)
    {
      //read parameter from ODataActionParameters 
      var createProducts = parameters["Value"] as CreateProductsDTO;
    
      //Process information
    }
    

    对此的请求如下所示:

    Post: ~odata/Company(1)/AddProducts
    body:
    { "Value" : {
    "Products" : 
    [{"Name":"Product1"},{"Name":"Product2"}]
    }
    }
    

    希望这会有所帮助。 问候, 米海

    【讨论】:

    • 感谢 Mihai 的快速响应,我应该在哪里添加这一行 (var action = builder.EntityType().Action("AddProducts"); action.Parameter("Value ");) 是在 WebapiConfig 中向 ODataConventionModelBuilder(或)DBModelbuilder 注册方法。 RegisterEntityType 整个 OnModelCreating。
    • 嗨,我到了应该有绑定动作的地方。我正在使用 System.Web.Http.OData.Builder,但我没有 builder.EntityType。如果我使用 System.Web.OData.Builder 我无法从“Microsoft.OData.Edm.IEdmModel”转换为“Microsoft.Data.Edm.IEdmModel”
    • 嗨,你是对的,这应该放在 ODataConventionModelBuilder 你使用什么版本的 OData ?
    • 不知道这是否会有所帮助,但我在这里发布了类似的情况。 stackoverflow.com/questions/40230498/…
    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 2020-03-21
    • 1970-01-01
    • 2016-01-20
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多