Проблема с Платформой Объекта 4, Составные типы, StoredProcs и временные таблицы

Я очищаю колени на Платформе Объекта 4 и сталкиваюсь с небольшой проблемой.

У меня есть некоторые хранимые процедуры, которые я вытягиваю в свой EDMX. Когда я создаю составные типы из этих procs, EF не имеет никакой проблемы при получении информации столбца. Кроме одного места. Будучи озадаченным некоторое время, я выясняю, что это была моя временная таблица, заполняемая, который вызывает проблему. На самом деле это просто называет ВСТАВКУ во временную таблицу, которая вызывает проблему. Я на самом деле не заполняю его ни с какой информацией.

В то время как я знаю, что могу вручную создать составной тип, затем отображают функцию на тот тип, я хотел бы смочь просто позволить EF заботиться о нем для меня. Кто-либо знает то, что я делаю неправильно?

Ниже образец proc, который не работает. Выполните это в DB и добавьте proc к Вам EDMX. Затем попытайтесь получить информацию столбца на экране "Add Function Import". Ничто не возвращается. Прокомментируйте ВСТАВКУ к временной таблице и получите информацию столбца, и она работает.

Спасибо, Steve

CREATE PROCEDURE dbo.TestProc
AS

SET NOCOUNT ON  

    CREATE TABLE #TempTable(
        StartDate datetime
    )

    INSERT INTO #TempTable
    SELECT  null


    DROP TABLE #TempTable

    SELECT 1 AS ReturnValue

SET NOCOUNT OFF
GO
7
задан Dean Kuga 15 June 2010 в 18:26
поделиться

1 ответ

Несколько вещей, которые стоит попробовать.

  1. Используйте вместо этого Таблицы переменных -> может быть, мастер импорта предпочтет это?
  2. Назовите поля для возврата.

Попробуйте использовать следующую сохраненную процедуру (непроверено ... просто подумайте вслух ...)

CREATE PROCEDURE dbo.Foo
AS

    SET NOCOUNT ON

    DECLARE @ResultTable TABLE (SomeId INTEGER)

    INSERT INTO @ResultTable
    SELECT DISTINCT Id AS Identity -- Or u can rename this field to anything...
    FROM SomeExistingTableWhichHasAnIdentityField

GO

Попробуйте это и посмотрите, обновится ли мастер сейчас.

-

Попытка №2 :)

Хорошо ... когда разработчик / мастер EF / кто-то еще не может ТОЧНО выяснить, что должен возвращать мой сохраненный процесс, я обычно делаю следующее: -

  1. Убедитесь, что хранимая процедура вообще не существует в конструкторе / контексте EF и т. Д. (У вас есть чистая отправная точка)
  2. Откройте вашу хранимую процедуру и / * / * комментарий out ВСЕ после определения процедуры.

например ..

ALTER PROCEDURE dbo.Foo
(
    Bar1 INT,
    Bar2 TINYINT,
    ... // whatever u have as your optional input arguments //
)
AS
    SET NOCOUNT ON

    /* 
    .... every thing in here is commented out 
    */
GO

Теперь ... 3. Добавьте принудительный ложный возврат в сохраненную процедуру, которая (более или менее) просто определяет структуру / поля вывода.

например ..

ALTER PROCEDURE dbo.Foo
(
    Bar1 INT,
    Bar2 TINYINT,
    ... // whatever u have as your optional input arguments //
)
AS
    SET NOCOUNT ON

    SELECT 1 AS Id, 1 AS UserId, 1 AS SomeOtherId, 
        CAST('AAA' AS NVARCHAR(350)) AS Name,
        -- etc etc etc..
    /* 
    .... every thing in here is commented out 
    */
GO

а затем ...

  1. Добавьте эту сохраненную процедуру в ваш дизайнер / мастер EF / и т. Д. Теперь правильные поля должны быть «определены» дизайнером. КЛАССНО. Да ... все значения жестко запрограммированы ... но это нормально (пока).
  2. Как только вы будете довольны тем, что EF теперь правильно обновлен, вернитесь к сохраненной процедуре и удалите весь жестко запрограммированный SELECT (что мы сделали на предыдущем шаге). Теперь удалим комментарии, которые закомментировали весь реальный код. Итак, у вас должен быть исходный сохраненный процесс.

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

win :)

это работает для тебя?

7
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: