Всем, ищу руководство по раскрытию хранимой процедуры с помощью 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");
}
Я добавлю КОНТРОЛЛЕР, как только проблема с ключом будет решена.
Спасибо за чтение.