Entity Framework и хранимая процедура, возвращающие проблемы с временной таблицей


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

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

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

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

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

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

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

Есть идеи,как это сделать?

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

4 3

4 ответа:

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

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

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

EF default way to get information about stored procedures запрашивает только "метаданные" - он не выполняет запросы или команды модификации данных. Из-за этого EF не может получать информацию о хранимых процедурах с помощью временных таблиц, dynaimc SQL и т. д. потому что эти сведения неизвестны до тех пор, пока команды не будут действительно выполнены.

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

SET FMTONLY OFF

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

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

IF 1=0 BEGIN
    SET FMTONLY OFF
END

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

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

Это полный хак, но я использовал его в прошлом, чтобы использовать entity framework со сложными хранимыми процедурами. Он использует тот факт, что Entity framework использует нулевые значения параметров при создании типа для зеркального отображения возвращаемого набора данных. Сделайте простой 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

- Том