Выполнение хранимой процедуры в 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)

Решение

У меня есть вопрос, почему вы запускаете это в 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 '