การใช้ Odata ที่เปิดใช้งาน ASP.NET Web-API เพื่อเรียกใช้ Stored Procedure

ทั้งหมด กำลังมองหาคำแนะนำในการเปิดเผย Stored Procedure โดยใช้ OData

ฉันกำลังแก้ไขแอป WEB-API ที่มีอยู่ซึ่งเปิดเผย OData แล้ว ขณะนี้แสดงตารางและมุมมองจาก SQL SERVER และตอนนี้ฉันจำเป็นต้องเปิดเผย Stored Procedure ด้วย Stored Procedure ปัจจุบันจะยอมรับพารามิเตอร์จำนวนมาก และผลักดันการเปลี่ยนแปลงไปยังตารางจำนวนหนึ่งบนฐานข้อมูลส่วนหลัง

นี่คือแพ็คเกจที่โครงการใช้:

<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>

ฉันได้ดำเนินการตามคำแนะนำนี้: การกระทำและฟังก์ชันใน OData v4 โดยใช้ ASP.NET Web API 2.2 เนื่องจากฉันเข้าใจว่า Stored Procedures ที่สนับสนุนอย่างไร้เดียงสานั้นเป็นไปไม่ได้ใน โอดาต้า.

ฉันได้แก้ไขแอปพลิเคชันที่มีอยู่ เพิ่มโมเดล และการเดินสายภายใน WebApiConfig ในการรันครั้งแรกฉันได้รับข้อผิดพลาดดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ไปโดยไม่บอก... ไม่ควรมีการกำหนดคีย์หลักสำหรับขั้นตอนการจัดเก็บ

โปรดทราบว่าฉันกำลังพยายามเข้าถึง "vw_tickets_all_tables" แต่ยังคงมีข้อผิดพลาดเกิดขึ้น... โดยอนุมานได้ว่าข้อผิดพลาดดังกล่าวทำให้แอปพลิเคชันทั้งหมดเสียหาย

นี่คือรหัสที่ฉันมี:

รุ่น:

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

ฉันจะเพิ่ม ตัวควบคุม เมื่อปัญหา "คีย์" ได้รับการแก้ไขแล้ว

ขอบคุณสำหรับการอ่าน.


person Bill Roberts    schedule 05.10.2017    source แหล่งที่มา


คำตอบ (1)


คุณได้เพิ่มคีย์สำหรับเอนทิตีประเภท InsertUpdateTicketsPJMTickets หรือไม่

เนื่องจากคุณพยายามเพิ่มเอนทิตีประเภท builder.EntityType<Models.UOMS.DBO.InsertUpdateTicketsPJMTickets>() และสร้างชุดเอนทิตีชื่อ InsertUpdateTicketsPJMTickets

จากข้อมูลจำเพาะของ OData แต่ละประเภทเอนทิตีจะเป็นประเภทโครงสร้างที่มีคีย์

คุณทำได้:

  1. เรียก API ได้อย่างคล่องแคล่ว HasKey

  2. เพิ่มแอตทริบิวต์ [key] บนคุณสมบัติที่คุณต้องการให้เป็น key

person Sam Xu    schedule 08.12.2017