我试图使用实体框架的存储过程返回任何内容。
我做了以下内容:
新增了一个功能(右键点击存储过程 - >添加 - >功能导入 - >复合类型 - >获取列信息 - >创建新的复合型)
我的函数名称: 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
{
-------------------
}
Answer 1:
OK - 这里是这样做的一步一步的方式:
(1)添加您的存储过程的EDMX文件(当您第一次使用创建它,或稍后Update model from database
,并挑选一个存储过程)
(2)一旦你在你的模型中的存储过程-使用Model Browser
添加Function Import
:
(3)在弹出的下一个对话框是非常重要的 - 你需要(1)定义一个存储过程返回复杂类型的集合,那么你就需要(2)得到该存储过程的列信息,以了解哪些列它会返回,然后(3)你告诉的Visual Studio基于该列信息生成一个新的复杂类型:
(4)一旦你做到了这一点 - 你现在应该看到在模型浏览器的概念模型部分的存储过程,以及新生成的复杂类型应该出现在那里,太:
Answer 2:
如果这仍然没有得到解决,您添加功能导入后,转到解决方案资源管理器中,右键点击你的名字{} .Context.tt文件,然后执行“运行自定义工具”。 该方法现在在派生Context类露面。
这似乎是在Visual Studio 2012年,这是我现在用的,我没有应用更新1中的错误,我会尝试看看能否解决。
Answer 3:
这是罗斯Brigoli
尝试添加此行到您的存储过程的开头:
SET FMTONLY OFF您已完成导入后,您可以删除此。
来源: - 为什么不能实体框架看我的存储过程的列信息?
Answer 4:
由于桑迪普说,EF不支持导入其构建结果从动态查询或临时表的设置存储过程。
但是,你不必重写整个SP。
只要写一个又一个,使用相同的名称,返回正确的行格式,而无需使用动态SQL或临时表。 然后使用EF SP加入的功能,现在会自动生成复杂类型。
编辑:这实际上是更容易做出评论时立即选择与指定投下所有的数据类型,该行在内的SP的顶部。 当你需要导入到SP EF,只是取消注释代码。
如
CREATE PROCEDURE MYPROC()
如
开始
- 取消以下行输入:
- 选择CAST(0为INT)AS column1Name,CAST( 'A' 为varchar(50))AS clumn2name
- 当你想导入注释掉SP的内容。
<正确SP内容>
结束
然后删除存储过程和创建原始。
保存在你再次需要的情况下,你做这个临时进口SP,虽然。
Answer 5:
EF不支持导入其构建结果从设置存储过程:
重新编写存储过程使用表变量来代替。 记得更新,因为它不会产生复杂的数据类型,除非它也增加了存储过程之前放弃从模型存储procudure和功能的进口。 或者去功能导入属性,并使用get列信息功能更新您的存储过程后。
Answer 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 col1=@col1,
col2=@col2,
WHERE uniqueId=@uniqueId and @uniqueId!=0
select * from @varResult
end
Answer 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
现在,您可以在使用EDMX以下消耗SP以上
添加存储过程的复杂类型实体框架
为什么不能实体框架看我的存储过程的列信息?
而如果你有以下工作对我来说,更新您的SP。 更新复杂类型,如果存储过程更新我该如何实体框架来更新复杂类型?
Answer 8:
对于我而言,我有地方进行导入我的存储过程到EF不会产生复杂的实体返回对象(自动)的问题。 然而,我发现,评论了我的存储过程(也称为存储过程)的部分后,当我再重新导入存储过程回(即使用功能导入编辑屏幕获取列信息按钮刷新),即复杂类型然后可以产生!
总之,有可能是导致EF不产生复杂类型where子句(或者别的东西)。 尝试注释掉您的存储过程的部分,且重新导入到存储过程
更新:
而且上面我的调查,我发现,没有被生成复杂实体的原因是因为我的存储过程使用的视图(而不是典型的表)。 出于好奇的缘故,我改变了看法到另一个表只是为了看看会发生什么,以及复杂实体生成。
因此,简而言之,它看起来像,如果你有一个观点复杂的实体可能不会自动生成。 要尝试,我暂时拆出来的观点,重新导入存储过程,所产生的复杂的实体,然后把视图回去。但是现在我的代码提供了异常。
以后会更新这个时候我学习更多=)
更新:
固定的问题。 真是愚蠢的错误! 我用没有拼写视图名右= d。 林有点生气,错误wasnt由SQL Server抛出,当我创建的存储过程.....我想这就是生活:)唉,现在的问题固定的!
Answer 9:
要正确添加复杂的类型,转到模型浏览器中,右键单击功能,然后显示编辑,单击编辑的填充对话框。 该功能的名称应该是相同的存储过程的名称。 单击OK按钮。 现在创建功能。 然后右击创建功能并编辑again.There是一个更新按钮抛开复杂类型的button.Update使用更新按钮它。 现在,复杂类型完全建立。
Answer 10:
没有出现复杂类型的问题可以到不同的发生原因,由于还有这是我面对我们的情况。 该问题是由于在SPROC一个语法错误,其中临时表被定义如下 - 创建表#TEMP(COL1 INT,COL2为nvarchar(100),COL3为nvarchar(100), - 注意到底逗号); 出人意料的是,当你编译存储过程的SQL Server不抛出任何错误。 删除逗号固定的问题我们。
总之,虽然上述的一些解决方案可能会根据具体问题的工作,我的建议是检查你的存储过程对于SQL可能会忽略,但可能是这个问题的根本原因,例如语法错误。 谢谢。
文章来源: Adding stored procedures complex types in Entity Framework