Подтвердить что ты не робот

Добавление сложных типов хранимых процедур в Entity Framework

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

Я сделал следующее:

  • Добавлена ​​функция (щелкните правой кнопкой мыши по хранимой процедуре → add → function import- > Complex Type → Получить информацию о столбце → Создать новый комплексный тип)

  • Мое имя функции: summarySP_Result. После создания проекта класс сущности не генерируется в Generated_code (BusinessAccount.web.g.cs)

Но классы объектов для таблиц и представлений создаются, но не для хранимой процедуры.

Может кто-нибудь дать идею, почему он не сгенерирован класс сущности в BusinessAccount.web.g.cs?

Обновление:

Позвольте мне подтвердить класс сущности ReturnDataFromTemTable_result, созданный в вашем классе XXXXXX.web.g.cs.

Вроде:

[DataContract(Namespace="http://schemas.datacontract.org/2004/07/BizFramework.Web.Model")]
public sealed partial class ReturnDataFromTemTable_Result : Entity
{
   -------------------
 }
4b9b3361

Ответ 1

ОК - здесь шаг за шагом это можно сделать:

(1) добавьте хранимую процедуру в файл EDMX (при первом ее создании или позже используя Update model from database и выбрав эту хранимую процедуру)

(2) после того, как у вас есть хранимая процедура в вашей модели - используйте Model Browser, чтобы добавить Function Import:

enter image description here

(3) следующее всплывающее диалоговое окно жизненно важно - вам нужно (1) определить, что хранимая процедура возвращает коллекцию сложных типов, тогда вам нужно (2) получить информацию о столбце из этой хранимой процедуры в знайте, в каких столбцах он вернется, тогда (3) вы сообщите Visual Studio о создании нового сложного типа на основе этой информации о колонке:

enter image description here

(4) после того, как вы это сделали - теперь вы должны увидеть хранимую процедуру в разделе концептуальной модели в обозревателе моделей, а также вновь созданный сложный тип:

enter image description here

Ответ 2

Если это еще не решилось, после добавления функции Импорт, перейдите в Обозреватель решений, щелкните правой кнопкой мыши файл {name}.Context.tt и выполните "Запустить пользовательский инструмент". Теперь метод будет отображаться в вашем производном классе Context.

enter image description here

Это похоже на ошибку в Visual Studio 2012, которая является тем, что я использую, я не применял обновление 1, я попытаюсь понять, исправляет ли это.

Ответ 4

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

Но вам не нужно переписывать весь свой SP.

Просто напишите еще одно имя с таким же именем, которое вернет правильный формат строки без использования динамического SQL или таблицы temp. Затем используйте функцию добавления EF SP, которая теперь автоматически генерирует сложный тип.

Изменить: на самом деле проще сделать комментарий в верхней части SP, который сразу же выбирает нужную строку со всеми типами данных, указанными в CASTS. Когда вам нужно импортировать SP в EF, просто раскомментируйте код.

например.

ПРОЦЕДУРА СОЗДАНИЯ myProc()
AS
НАЧАТЬ
- раскомментируйте следующую строку для импорта:
- SELECT CAST (0 AS int) AS column1Name, CAST ('a' AS varchar (50)) AS clumn2name

- закомментируйте содержимое SP, когда вы хотите его импортировать.
< правильный контент SP >
END

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

Ответ 5

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

  • Динамические запросы
  • Временные таблицы

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

Ответ 6

create procedure [dbo].[usp_InsertOrUpdate]
/*if your table(tbl_InsertOrUpdate) as 3 columns like uniqueid,col1,col2*/
@uniqueId bigint NULL,/*if insert send value as null or 0*/
@col1 bigint null,
@col2 [varchar](500) NULL
as
begin
set nocount ON
SET FMTONLY OFF
/* for giving result which column updated(uniqueId) and is it insert or update(IsInsert)*/
declare @varResult table (uniqueId bigint ,IsInsert bit )
/*create a var table before inserting original table*/

declare @varInsertOrUpdate table (
uniqueId bigint ,
col1 [bigint] ,
col2 [varchar]
)
/*default we are feel as update only*/
insert into @varResult (uniqueId,IsInsert) values (@uniqueId,0)
/*insert into var table*/
INSERT INTO @varInsertOrUpdate (uniqueId,col1,col2)
VALUES
(@uniqueId,@col1,@col2)
/*Insert into original table with where condition without if else*/
 INSERT INTO tbl_InsertOrUpdate (col1,col2)
 select col1,col2 from @varInsertOrUpdate
 where uniqueId!=0;
/*if its insert updating result returning table*/
 update @varResult set 
 uniqueId=IDENT_CURRENT('tbl_InsertOrUpdate'),
IsInsert=1 where @uniqueId=0;
/*updating table where @uniqueid is  null or empty*/
UPDATE tbl_InsertOrUpdate
SET [email protected], 
[email protected],
WHERE [email protected] and @uniqueId!=0

select *  from @varResult

end

Ответ 7

Это мой SP для реализации множественного поиска

***************************************************

    CREATE PROCEDURE [dbo].[uspSEARCH_POSITIONS]
        @OBJ_TYPE_REQUEST varchar(2000),--'FIRST_NAME;SEARCHVALUE|LAST_NAME;SEARCHVALUE|JOB_DESCRIPTION;SEARCHVALUE'
        @DELIMITER varchar(10) --'| Which seperates the col;searchvalue|col;searchvalue
    AS
    BEGIN
    SET FMTONLY OFF
        DECLARE
            @lLastName varchar(100),
            @lFirstName varchar(100),
            @lPositionNumber varchar(20),
            @lJobDescription varchar(50),
            @lJobCode varchar(20),
            @lOccupancyIndicator varchar(50),
            @ldeleimitercolsearchval varchar(10)

    SET @ldeleimitercolsearchval =';'

    CREATE TABLE #TempTable (ColSearchValues VARCHAR(2000))

    INSERT INTO #TempTable 
    SELECT * FROM [dbo].[fnSplit](@OBJ_TYPE_REQUEST,@DELIMITER)--'fname;searchvalfname|lname;searchvallname|jobcode;searchvaljobcode','|')

    SELECT @lLastName=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%last%'
    SELECT @lFirstName =SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%first%'
    SELECT @lPositionNumber =SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%position%'
    SELECT @lJobDescription=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%jobd%'
    SELECT @lJobCode=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%jobc%'
    SELECT @lOccupancyIndicator=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%ccupancy%'

           SELECT  [PS].[POSITION_NUMBER]
          ,[PS].[COST_CENTER]
          ,[PS].[JOB_CODE]
          ,[PS].[JOB_CODE_DESCRIPTION]
          ,[PS].[SITE_CODE]
          ,[EMP].[EMPLOYEE_ID]
          ,[EMP].[EIN]
          ,[EMP].[GRADE]
          ,[EMP].[LOGIN_ID]
          ,[EMP].[FIRST_NAME]
          ,[EMP].[LAST_NAME]
          ,LTRIM(RTRIM(ISNULL([EMP].[LAST_NAME],''))) + ',' +LTRIM(RTRIM(ISNULL([EMP].[FIRST_NAME],''))) AS [FULL_NAME]      
          ,[EMP].[DISTRICT]
          ,[EMP].[SUPERVISOR_EIN]
          ,COUNT(*) OVER() AS TOTAL_RECORD_COUNT
      FROM [DBSERVER].[dbo].[uvwPOSITION_SEARCH] PS
      LEFT JOIN [DBSERVER].[dbo].[uvwEMPLOYEES] EMP
      ON PS.POSITION_NUMBER=EMP.POSITION_NUMBER
      WHERE
            (@lLastName  IS NULL OR [LAST_NAME] LIKE '%' + @lLastName + '%')
        AND (@lFirstName IS NULL OR [FIRST_NAME] LIKE '%' + @lFirstName + '%')
        AND (@lPositionNumber IS NULL OR [PS].[POSITION_NUMBER] LIKE '%' + @lPositionNumber + '%')
        AND (@lJobDescription IS NULL OR [PS].[JOB_CODE_DESCRIPTION] LIKE '%' + @lJobDescription + '%')
        AND (@lJobCode IS NULL OR [PS].[JOB_CODE] LIKE '%' + @lJobCode + '%')
        AND (@lOccupancyIndicator IS NULL OR [EMP].[FILLED_VACANT] LIKE '%' + @lOccupancyIndicator + '%')

    END

Теперь вы можете использовать выше SP в edmx, используя ниже

Добавление сложных типов хранимых процедур в Entity Framework

Почему инфраструктура Entity Framework не может видеть информацию о столбце хранимой процедуры?

И в случае, если вам нужно обновить свой SP ниже, работал у меня. Обновление сложного типа при обновлении хранимой процедуры Как получить инфраструктуру Entity для обновления сложных типов?

Ответ 8

Для меня у меня возникают проблемы, при которых импортирование моей хранимой процедуры в EF не создает объект возврата Complex Entity (автоматически). Однако я обнаружил, что после комментирования разделов моего sproc (aka хранимой процедуры), что, когда я снова импортировал хранимую процедуру (например, обновленный с помощью кнопки Get Column Information на экране Import Import), тип Complex может быть сгенерировано!

Короче говоря, может существовать предложение where (или, возможно, что-то еще), заставляющее EF не генерировать сложный тип. Попробуйте прокомментировать разделы вашего sproc и повторно импортировать sproc в

UPDATE:

В дополнение к моему исследованию выше, я обнаружил, что причина, по которой сложная сущность не создавалась, заключалась в том, что мой sproc использовал представление (вместо обычной таблицы). Для любопытства я изменил представление на другую таблицу, чтобы увидеть, что произойдет, и сгенерированный сложный объект.

Итак, короче говоря, похоже, что сложные объекты могут не генерироваться автоматически, если у вас есть представление. Чтобы попробовать, я временно вырвал представление, повторно импортировал sproc, сгенерировал Complex Entity, а затем вернул представление. Но теперь мой код дает исключения.

Будет обновляться позже, когда я узнаю больше =)

UPDATE:

Исправлена ​​ошибка. Действительно глупая ошибка! Имя вида, которое я использовал, не было написано справа = D. Я вроде разозлился, что ошибка не была выбрана сервером Sql, когда я создал sproc..... Я думаю, это жизнь:) Увы, проблема теперь исправлена!

Ответ 9

Чтобы добавить сложный тип правильно, перейдите в браузер модели, щелкните правой кнопкой мыши по функции, затем отобразите править, нажмите "изменить заполнение диалогового окна". Имя функции должно быть таким же, как имя хранимой процедуры. Нажмите кнопку "ОК". Теперь создается функция. Затем щелкните правой кнопкой мыши на созданную функцию и снова сделайте редактирование. Кнопка кнопки обновления в стороне от кнопки сложного типа. Обновите ее, используя эту кнопку обновления. Теперь сложный тип создается полностью.

Ответ 10

Проблема сложного типа, не появляющаяся, может произойти и по другой причине, с которой я столкнулся в нашем случае. Проблема возникла из-за синтаксической ошибки в SPROC, где временная таблица была определена следующим образом: создайте таблицу #temp (col1 int, col2 nvarchar (100), col3 nvarchar (100), - обратите внимание на запятую в конце); Удивительно, но SQL Server не выдает никаких ошибок при компиляции sproc. Удаление запятой устранило проблему для нас.

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

Ответ 11

Перейти в браузер моделей

Если вам нужно изменить существующую функцию

В разделе Импорт функций >> Выберите функцию для изменения >> Нажмите "Изменить".

Вам нужно обновить функцию, чтобы обновить, и вы можете увидеть столбцы должны быть добавлены