Импорт функций в Entity Model с типом возврата, отличным от Entity - PullRequest
8 голосов
/ 23 февраля 2009

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

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

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

<ч /> Использование Visual Studio 2008 v9.0.30729.1 SP (с пакетом обновления 1)

Ответы [ 3 ]

8 голосов
/ 23 февраля 2009

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

4 голосов
/ 24 апреля 2009

Поскольку единственное, что работает сейчас, - это сопоставление возвращаемого типа с сущностью, одним из обходных путей является создание представления, соответствующего возвращаемым данным, и создание сущности для представления. Это будет работать только в том случае, если 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. Toby

3 голосов
/ 06 января 2010

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

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

...