Использование Odata с поддержкой ASP.NET Web-API для вызова хранимой процедуры

Всем, ищу руководство по раскрытию хранимой процедуры с помощью OData.

Я изменяю существующее приложение WEB-API, которое уже предоставляет OData. В настоящее время он предоставляет таблицы и представления из 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>

Я старался следовать этому руководству: Действия и функции в OData v4 с использованием ASP.NET Web API 2.2, поскольку я понимаю, что наивно поддерживаемые хранимые процедуры невозможны в OData.

Я изменил существующее приложение, добавив модель и проводку внутри 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;}
}

ВепАпиКонфиг:

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. Вызов Fluent API HasKey

  2. Добавьте атрибут [ключ] к свойству, которое вы хотите сделать key

person Sam Xu    schedule 08.12.2017