使用Odata启用ASP.NET Web-API来调用存储过程

时间:2017-10-05 18:11:28

标签: stored-procedures asp.net-web-api asp.net-web-api-odata

全部, 寻找有关使用 OData 公开存储过程的指导。

我正在修改已公开 OData 的现有WEB-API应用。它目前公开来自SQL SERVER的表和视图,现在我需要让它暴露存储过程。当前的存储过程将接受一堆参数,并将更改推送到后端数据库上的少数几个表。

以下是项目使用的包:

<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net45" />
  <package id="EntityFramework" version="6.0.2" targetFramework="net45" />
  <package id="LinqKit" version="1.1.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.Cors" version="5.2.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.OData" version="5.2.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Cors" version="5.2.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.Data.Edm" version="5.6.3" targetFramework="net45" />
  <package id="Microsoft.Data.OData" version="5.6.3" targetFramework="net45" />
  <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net45" />
  <package id="Microsoft.OData.Client" version="6.8.1" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.6.0" targetFramework="net45" />
  <package id="Microsoft.OData.Core" version="6.8.1" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.6.0" targetFramework="net45" />
  <package id="Microsoft.OData.Edm" version="6.8.1" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.6.0" targetFramework="net45" />
  <package id="Microsoft.Spatial" version="6.8.1" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" />
  <package id="Patches.System.Web.OData" version="5.3.0-datetimefixes" targetFramework="net45" />
  <package id="System.Linq.Dynamic" version="1.0.2" targetFramework="net45" />
  <package id="System.Spatial" version="5.6.3" targetFramework="net45" />
</packages>

我已经努力遵循本指南:Actions and Functions in OData v4 Using ASP.NET Web API 2.2,据我所知, OData 无法实现天真支持的存储过程。

我修改了现有的应用程序,添加了模型以及WebApiConfig内部的布线。在我第一次运行时出现以下错误:

enter image description here

不言而喻......不应该是为存储过程定义的主键。

请注意,我尝试访问&#34; vw_tickets_all_tables&#34;,但仍然会抛出错误...推断错误会破坏整个应用程序。

这是我到目前为止的代码:

MODEL:

public class InsertUpdateTicketsPJMTickets : DbContext
{
    public InsertUpdateTicketsPJMTickets()
            : base("name=InsertUpdateTicketsPJMTickets")
    {
    }
    public DbSet<InsertUpdateTicketsPJMTicketsBase> InsertUpdateTicketsPJMTickets { get; set; }
}
public partial class InsertUpdateTicketsPJMTicketsBase
{
    string ticketType{set; get;}
    string category{set; get;}
    string title{set; get;}
    string details{set; get;}
    Nullable<bool> isHtml{set; get;}
    // bunches of fields left out for brevity
    string lastUpdateBy{set; get;}
    string createdBy{set; get;}
    string creationName{set; get;}
    string revisionName{set; get;}
}

WepApiConfig:

public static IEdmModel GetUOMSModel()
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.ContainerName = "UOMSContext";
    builder.EntityType<Models.UOMS.DBO.InsertUpdateTicketsPJMTickets>()
        .Action("Execute");

    var function = builder.Function("GetParameters");

    function.Parameter<string>("ticketType");
    function.Parameter<string>("category");
    function.Parameter<string>("title");
    function.Parameter<string>("details");
    // bunches of fields left out for brevity
    function.Parameter<int?>("inputTicketId");
    function.Parameter<string>("lastUpdateBy");
    function.Parameter<string>("createdBy");
    function.Parameter<string>("creationName");
    function.Parameter<string>("revisionName");
    function.ReturnsCollectionFromEntitySet<Models.UOMS.DBO.InsertUpdateTicketsPJMTickets>("InsertUpdateTicketsPJMTickets");
}

我会在&#34; Key&#34;之后添加 CONTROLLER 。问题已经解决。

感谢您的阅读。

1 个答案:

答案 0 :(得分:0)

您是否为实体类型InsertUpdateTicketsPJMTickets添加了密钥?

因为您尝试添加实体类型builder.EntityType<Models.UOMS.DBO.InsertUpdateTicketsPJMTickets>() 并创建名为InsertUpdateTicketsPJMTickets的实体集。

根据OData规范,每个实体类型都是带键的结构类型。

你可以这样做:

  1. 调用Fluent API HasKey

  2. 在要将其设为key

  3. 的属性上添加属性[key]