Импорт функций в модели сущностей с типом возврата, отличным от сущности

У меня есть хранимая процедура в моей модели данных сущности, и я добавил ее в функцию импорта.

Проблема в том, что ... Visual Studio генерирует код функции в коде программной части модели тогда и только тогда, когда я указываю возвращаемый тип объекта. Скалярные и нулевые возвращаемые типы не работают. Visual Studio не генерирует код функции, когда я их выбираю.

Что-то мне не хватает или это ошибка?
Какие-нибудь обходные пути?


Использование Visual Studio 2008 v9.0.30729.1 SP (Service Pack 1)

Ответов (3)

Решение

Это не столько ошибка, сколько отсутствие функции. Entity Framework прямо сейчас не поддерживает хранимые процедуры, возвращающие скалярные значения. Я считаю, что это должно измениться в .NET 4.0. А пока вы можете выполнить такую ​​хранимую процедуру, используя соединение с магазином, доступное через CreateDbCommand .

Поскольку единственное, что сейчас работает, - это сопоставить возвращаемый тип с сущностью, один обходной путь - создать представление, которое соответствует возвращаемым данным, и создать объект для представления. Это будет работать, только если SP выполняет SELECT для возврата набора результатов, а не возвращаемого значения. Я получил это для работы с примером приложения, например: SP:

ALTER PROCEDURE [dbo].[DoSomething]
    @param1 varchar(50),
    @param2 varchar(50)
AS
BEGIN
    DECLARE @ID INT
    SET NOCOUNT ON;
    INSERT tmp_header (fname, lname) VALUES (@param1, @param2) 
    SET @ID = SCOPE_IDENTITY()
    SELECT @ID AS 'id'
END

ПОСМОТРЕТЬ:

CREATE VIEW [dbo].[View_1]
AS
SELECT   0 as  id

Создайте функцию импорта, задав тип возвращаемого значения View_1, и постройте модель.

в коде:

    class Program
    {
      static void Main(string[] args)
      {
        using (PS_RADSTESTEntities ctx = new PS_RADSTESTEntities())
        {
          EntityConnection ec = ctx.Connection as EntityConnection;
          ec.Open();
          DbTransaction txn = ec.BeginTransaction();
          ObjectResult<View_1> result = ctx.DoSomething("Toby", "Kraft");
          View_1 row = result.Single();
          int id = row.id;
// do some other interesting things ...
          ctx.SaveChanges();
          txn.Commit();
        }
      }
    }

Обязательно задайте одинаковые имена столбцов для представления и SP. Тоби

У меня была аналогичная проблема, и я решил ее с помощью этой статьи:

http://blogs.msdn.com/bindeshv/archive/2008/11/21/using-stored-procedures-that-return-non-entity-type.aspx