Выполнение хранимой процедуры в Entity Framework из ADO.Net DataService
Я использую ADO.Net DataServices для предоставления модели данных сущности в Silverlight. В модели есть хранимая процедура, которая возвращает значение void. Я хочу вызвать эту процедуру из клиента Silverlight.
Насколько я понимаю, я должен добавить метод [WebInvoke] в класс DataService и использовать DbCommand для вызова хранимой процедуры.
Вот мой код:
using System.Data.Common;
using System.Data.Services;
using System.ServiceModel.Web;
namespace Foo.Web
{
public class PayrollDataService : DataService<Foo.Web.PayrollEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.UseVerboseErrors = true;
}
[WebInvoke]
public void RunMyProcedure()
{
DbConnection conn = this.CurrentDataSource.Connection;
DbCommand cmd = conn.CreateCommand();
// TODO: Call the stored procedure in the EF Data Model.
}
}
}
Может ли кто-нибудь подтвердить, что это правильный подход, и показать пример использования DbCommand в этой ситуации?
Ответов (2)2
У меня есть вопрос, почему вы запускаете это в Entity Framework, поскольку вы ничего не возвращаете, что говорит мне, что вы на самом деле не заполняете объекты. Если это просто некоторая очистка и не влияет на данные, у меня не было бы этого в EF.
Нет ничего плохого в использовании DBCommand для запуска запросов, если это ваш вопрос. И если вы действительно затрагиваете объекты EF, я бы не стал так беспокоиться о хранении процедуры там. Если процедура не затрагивает объекты EF, я бы предпочел, чтобы она была отделена от EF, а не воспринимала все как гвоздь, а EF - как молоток.
Вы должны импортировать свою процедуру хранения в свою модель edmx, функцию импорта, которая вернет None, и вызвать ее из вашего кода. Именно так:
[WebInvoke][WebGet]
public void RunMyProcedure(int Param1, string Param2)
{
this.CurrentDataSource.ImportedFunction(Param1,Param2);
}
Затем вы можете вызвать его из браузера: http: //urltoservice/serviceName.svc/RunMyProcedure?Param1=666&Param2='stringvalue '