Entity Framework и хранимая процедура, возвращающая временную таблицу - PullRequest
3 голосов
/ 18 марта 2012

(Отказ от ответственности - я не дизайнер баз данных. Я просто плохой разработчик, который должен сделать эту работу.)

На данный момент существует 17 (на данный момент) таблиц с идентичной структурой - имя,адрес, номер телефона.

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

Итак, я создал представлениечтобы получить список таблиц (есть справочная таблица, содержащая эту информацию), затем я создал хранимую процедуру для

  1. создания временной таблицы,
  2. с использованием курсоров, проверьте каждую таблицув представлении для номера телефона, используя объединение sql.Если запись найдена, вставьте ее во временную таблицу.
  3. возвращает строки из временной таблицы.

Все это работает в прямом T-SQL.

Теперь я пытаюсь использовать Entity Framework 4+ для вызова хранимой процедуры.Но интерфейс импорта функций не будет генерировать столбцы.Там написано, что возвращаемый тип = нет, а код LINQ ожидает int и не будет компилироваться.

Есть идеи, как заставить это работать?

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

Ответы [ 4 ]

5 голосов
/ 18 марта 2012

EF По умолчанию способ получения информации о хранимых процедурах запрашивает только «метаданные» - он не выполняет запросы или команды изменения данных.Из-за этого EF не может получать информацию о хранимых процедурах с использованием временных таблиц, dynaimc SQL и т. Д., Поскольку эта информация неизвестна до тех пор, пока команды действительно не будут выполнены.

В качестве обходного пути вы можете изменить свою процедуру и в начале поставить

SET FMTONLY OFF

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

3 голосов
/ 25 февраля 2013

Добавление этого нелогичного блока кода решило проблему.Даже если он никогда не будет нажимать

IF 1=0 BEGIN
    SET FMTONLY OFF
END

Почему мой набранный набор данных не похож на временные таблицы?

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataset/thread/fe76d511-64a8-436d-9c16-6d09ecf436ea/

2 голосов
/ 23 октября 2012

Это полный взлом, но в прошлом я использовал его для использования структуры сущностей со сложными хранимыми процедурами. Он использует тот факт, что структура сущностей использует значения параметров NULL при создании типа для зеркального отображения возвращенного набора данных. Сделайте простой IF (параметр NULL) и поддельный набор данных возврата, который соответствует тому, что вы вернете.

ALTER proc [dbo].[cust_auto_doc_list_invoice]
@interval_ref integer
AS
SET NOCOUNT ON;

IF @interval_ref IS NULL
BEGIN
-- This is to fool the edmx generator.
    SELECT CONVERT(integer,0) as group_ref,
        CONVERT(varchar(50),'') as group_name,
        CONVERT(integer,0) as wloc_ref,
        CONVERT(decimal(18,0),0) as invoice_ref,
        CONVERT(decimal(10,0),0) as cust_ref,
        CONVERT(varchar(50),'') as cust_name,
        CONVERT(decimal(10,0),0) as csnee_ref,
        CONVERT(varchar(50),'') as csnee_name
END
ELSE
BEGIN
  -- Do real work here
END

-Tom

0 голосов
/ 18 марта 2012

Я не знаю решения для части EF, но в базе данных я просто создал бы следующее представление:

select * from Table1
union all select * from Table2
union all select * from Table3
union all select * from Table4
...

Тогда вы можете использовать EF для запроса представления, как вам нравится.Нет необходимости в курсорах и тому подобном.

...