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

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

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

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

  2. Имя моей функции: summarySP_Result . После создания проекта class объектов не генерируется в Generated_code ( BusinessAccount.web.g.cs )

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

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

Обновить :

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

Подобно :

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

ОК – вот пошаговый способ сделать это:

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

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

Это для Росса Бриголи

Попробуйте добавить эту строку в начало хранимой процедуры:

SET FMTONLY OFF Вы можете удалить это после завершения импорта.

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

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

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

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

 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 

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

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

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

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

например

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

– закомментируйте содержимое SP, когда вы хотите его импортировать.
<надлежащий контент SP>
КОНЕЦ

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

Это мой 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 для обновления сложных типов?

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

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

ОБНОВИТЬ:

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

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

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

ОБНОВИТЬ:

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

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

  • Как поднять ошибку в функции MySQL
  • Динамические имена таблиц в функции хранимой процедуры
  • Как я могу использовать хранимую процедуру в базе данных MySql с Zend Framework?
  • Получить результаты из хранимой процедуры oracleа
  • Захват хранимой процедуры печати вывода в .NET.
  • Передача массива данных в качестве входного параметра в процедуру Oracle
  • MySQL хранимой процедуры против функции, которую я буду использовать, когда?
  • Вызов хранимой процедуры Oracle из C #?
  • Единовременный эквивалент сохраненной процедуры MongoDB
  • Как создать хранимую процедуру в MS Access?
  • Как передать строковый параметр с помощью оператора `IN` в хранимой процедуре SQL Server 2008
  • Давайте будем гением компьютера.