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

.net .net-3.5 ado.net entity-framework visual-studio

Вопрос

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

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

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


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

Принятый ответ

Это не столько ошибка, сколько отсутствие функции. 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. Тоби



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему