在Entity Framework中添加存储过程复杂types
我想在entity framework中使用存储过程,不返回任何内容。
我做了以下几点:
-
添加一个函数(右键单击存储过程 – >添加 – >函数导入 – >复杂types – >获取列信息 – >创build新的复杂types)
-
我的函数名称:
summarySP_Result
。 在构build项目之后,实体类不会在Generated_code
(BusinessAccount.web.g.cs
)中Generated_code
但是表和视图的实体类都是创build的,但不是存储过程。
任何人都可以给出这个想法,为什么它不是在BusinessAccount.web.g.cs
生成实体类?
更新:
让我确认在XXXXXX.web.g.cs
类中创build的ReturnDataFromTemTable_result
实体类。
喜欢 :
[DataContract(Namespace="http://schemas.datacontract.org/2004/07/BizFramework.Web.Model")] public sealed partial class ReturnDataFromTemTable_Result : Entity { ------------------- }
好的 – 下面是这样做的一步一步的方法:
(1)将存储过程添加到EDMX文件(首次创build时,或稍后使用Update model from database
并选取该存储过程)
(2)一旦你在你的模型中有存储过程 – 使用Model Browser
来添加一个Function Import
:
(3)popup的下一个对话框非常重要 – 您需要(1)定义存储过程返回一个复杂types的集合,然后您需要(2)从该存储过程获取列信息,以了解哪些列它会返回,然后(3)你告诉Visual Studio根据该列信息生成一个新的复杂types:
(4)一旦你这样做了 – 现在你应该在模型浏览器中的概念模型部分看到存储过程,并且新生成的复杂types也应该显示在那里:
如果仍然无法解决,请在添加function导入后,转到解决scheme资源pipe理器,右键单击您的{name} .Context.tt文件并执行“运行自定义工具”。 该方法现在将显示在派生的Context类中。
这似乎是Visual Studio 2012中的一个错误,这是我正在使用的,我没有应用更新1,我会尝试看看是否修复它。
这是罗斯Brigoli
尝试将此行添加到存储过程的开头:
SET FMTONLY OFF您可以在完成导入后将其删除。
来源: – 为什么不能entity framework看到我的存储过程的列信息?
EF不支持从以下版本导入构build结果集的存储过程:
- dynamic查询
- 临时表
重写您的存储过程,以使用表variables。 请记住在更新之前,从模型中删除存储过程和函数导入,因为它不会生成复杂types,除非它还添加存储过程。 或者去function导入属性和更新您的存储过程后使用获取列信息function。
这是我的SP来实现多重search
*************************************************** 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
现在你可以使用下面的edmx消耗SP以上
在Entity Framework中添加存储过程复杂types
为什么Entity Framework不能看到我的存储过程的列信息?
如果你不得不更新下面的SP为我工作。 如果存储过程更新,则更新复杂types如何获取entity framework以更新复杂types?
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 col1=@col1, col2=@col2, WHERE uniqueId=@uniqueId and @uniqueId!=0 select * from @varResult end
正如Sandeep所说,EF不支持导入从Dynamic查询或临时表生成结果集的存储过程。
但是你不必重写你的整个SP。
只需编写另一个具有相同名称的文件,即可在不使用dynamicSQL或临时表的情况下返回正确的行格式。 然后使用EF SP添加function,现在将自动生成复杂types。
然后放下存储的proc并创build原始文件。
但是,保存这个临时导入的SP,以防止您再次需要它。
对我来说,我有导入我的存储过程到EF中的问题是不会生成复杂的实体返回对象(自动)。 然而,我发现在我的sproc(也称为存储过程)的部分注释之后,当我然后重新导入存储的过程(即使用function导入编辑屏幕中的获取列信息button刷新),复杂types然后可以生成!
总之,可能有一个where子句(或者别的什么)导致EF不能生成复杂types。 尝试注释掉你的sproc部分并重新导入sproc
更新:
除了上面的调查之外,我发现复杂实体没有被生成的原因是因为我的sproc使用了一个视图(而不是一个典型的表)。 为了好奇,我将视图改为另一个表,以查看会发生什么,并生成复杂的实体。
因此,简而言之,如果您有视图,看起来复杂实体可能不会自动生成。 试一下,我暂时剔除了视图,重新导入了sproc,生成了复杂实体,然后放回了视图。但是现在我的代码给出了exception。
稍后当我学习更多时会更新=)
更新:
修复了这个问题。 真是愚蠢的错误! 我使用的视图名称不是拼写正确= D。 林有点生气,Sql服务器时,我创build了一个错误没有被激发…..我猜这就是生活:)唉,问题现在已经修复!
要正确添加复杂types,进入Model浏览器,右键点击function,然后显示编辑,点击编辑填写对话框。 函数的名称应该与存储过程的名称相同。 点击确定button。 现在函数被创build。 然后右键单击创build的function并使用更新button进行更新。 现在复杂types被完全创build。