Menggunakan Odata mengaktifkan ASP.NET Web-API untuk memanggil Prosedur Tersimpan

Semua, Mencari panduan dalam mengekspos Prosedur Tersimpan menggunakan OData.

Saya memodifikasi aplikasi WEB-API yang sudah mengekspos OData. Saat ini mengekspos tabel dan tampilan dari SQL SERVER, dan sekarang saya diharuskan untuk mengekspos prosedur Tersimpan juga. Prosedur Tersimpan saat ini akan menerima banyak parameter, dan mendorong perubahan ke beberapa tabel di database back-end.

Berikut adalah paket-paket yang digunakan oleh proyek ini:

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

Saya telah berupaya untuk mengikuti panduan ini: Tindakan dan Fungsi di OData v4 Menggunakan ASP.NET Web API 2.2, karena saya memahami bahwa Prosedur Tersimpan yang didukung secara naif tidak mungkin dilakukan di OData.

Saya telah memodifikasi aplikasi saya yang sudah ada, menambahkan model, dan pengkabelan di dalam WebApiConfig. Saat pertama kali dijalankan, saya mendapatkan kesalahan berikut:

masukkan deskripsi gambar di sini

Tak perlu dikatakan lagi... Seharusnya tidak ada kunci utama yang ditentukan untuk prosedur tersimpan.

Perhatikan bahwa saya mencoba mengakses "vw_tickets_all_tables", dan kesalahan tetap muncul... menyimpulkan bahwa kesalahan tersebut merusak seluruh aplikasi.

Inilah kode yang saya miliki sejauh ini:

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

Saya akan menambahkan CONTROLLER setelah masalah "Kunci" teratasi.

Terima kasih telah membaca.


person Bill Roberts    schedule 05.10.2017    source sumber


Jawaban (1)


Apakah Anda menambahkan kunci untuk tipe entitas InsertUpdateTicketsPJMTickets?

Karena Anda mencoba menambahkan entitas tipe builder.EntityType<Models.UOMS.DBO.InsertUpdateTicketsPJMTickets>() dan membuat kumpulan entitas bernama InsertUpdateTicketsPJMTickets.

Dari spesifikasi OData, setiap tipe entitas adalah tipe struktural dengan kunci.

Anda dapat melakukan:

  1. Panggil API Lancar HasKey

  2. Tambahkan atribut [key] pada properti yang ingin Anda jadikan key

person Sam Xu    schedule 08.12.2017