RIA Services - вызов хранимой процедуры - PullRequest
2 голосов
/ 21 сентября 2010

Я использую RIA Services с Silverlight и Entity Framework. Я хочу вызвать хранимую процедуру и сопоставить результаты с сеткой данных. Каков наилучший способ сделать это? Вывод хранимой процедуры не сопоставляется ни с одним дизайном таблицы.

Я нашел следующую статью -

http://blogs.msdn.com/b/tom/archive/2009/05/07/silverlight-ria-calling-stored-procedures-that-don-t-return-tables.aspx

Однако, это не работает для меня - я получаю сообщение об ошибке, в котором говорится, что в результирующем комплексном наборе не определен первичный ключ. Я не вижу, как определить это в коде.

В любом случае, я открыт для любых решений.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

На этом сайте я нашел следующее превосходное пошаговое руководство -

http://betaforums.silverlight.net/forums/p/218383/521023.aspx

1) Добавить модель данных объекта ADO в ваш веб-проект;Выберите вариант «Сгенерировать из базы данных»;Выберите экземпляр вашей базы данных для подключения.

2) Выберите объект БД для импорта в модель.Вы можете развернуть узел Таблица, чтобы выбрать любую таблицу, которую вы хотите импортировать в Модель.Разверните узел «Хранимая процедура», чтобы выбрать также сохраненную процедуру.Нажмите Finish, чтобы завершить импорт.

3) Щелкните правой кнопкой мыши конструктор модели DB, чтобы выбрать Add / Function Import.Дайте функции имя (то же имя, что и у вашего SP), и выберите хранимую процедуру, которую вы хотите отобразить.Если ваш SP возвращает только одно поле, вы можете отобразить возвращаемый результат в коллекцию скаляров.Если ваш SP возвращает более одного поля, вы можете сопоставить возвращаемый результат с коллекцией или Entity (если все поля взяты из одной таблицы) или с коллекцией сложных типов.

Если вы хотите использовать сложный тип, вы можете нажать кнопку Получить столбец, чтобы получить все столбцы для вашего SP.Затем нажмите кнопку Создать новый сложный тип, чтобы создать этот сложный тип.

4) Добавить класс доменной службы в веб-проект.Выберите DataModel, который вы только что создали, в качестве DataContext этой службы.Выберите весь энтит, который вы хотите выставить клиенту.Сервисные функции должны быть сгенерированы для этих объектов.

5) Возможно, вы не видите тип Complex в списке объектов.Вы должны вручную добавить функцию запроса для вашего SP в ваш Сервис: допустим, ваш SP называется SP1, а созданный вами комплексный тип называется SP1_Result.

Добавьте следующий код в ваш класс обслуживания домена:

public IQueryable<SP1_Result> SP1()
    {
        return this.ObjectContext.SP1().AsQueryable();            
    }

Теперь вы можете скомпилировать свой проект.Вы можете получить сообщение об ошибке, подобное этому: «SP1_Result не имеет ключа» (если вы не участвуете в RIA service SP1 beta).Если вы это сделаете, вам нужно сделать следующее в файле метаданных службы:

Добавлен класс метаданных SP1_Result и отмечено поле Key:

[MetadataTypeAttribute(typeof(SP1_Result.SP1_ResultMetadata))]
public partial class SP1_Result
{
    internal sealed class SP1_ResultMetadata
    {
        [Key]
        public int MyId;  // Change MyId to the ID field of your SP_Result
    }
} 

6) Скомпилируйте ваше решение.Теперь у вас есть SP1_Result для клиента.Проверьте сгенерированный файл, вы должны увидеть, что SP1_Result генерируется как класс Entity.Теперь вы можете получить доступ к DomainContext.SP1Query и DomainContext.SP1_Results в вашем коде Silverlight.Вы можете обращаться с ним так же, как и с любым другим классом Entity (сущность, сопоставленная с таблицей).

2 голосов
/ 22 сентября 2010

Ну, я понял, как это сделать, хотя это немного грязно. Вам необходимо создать класс метаданных для набора результатов в файле метаданных домена. После этого RIA будет относиться к этому по существу так же, как к организации.

Полную информацию можно найти здесь - http://leeontech.wordpress.com/2010/05/24/ria-services-and-storedprocedures/

...