43

我正在尝试在实体框架中使用不返回任何内容的存储过程。

我做了以下事情:

  1. 添加了一个函数(右键存储过程->添加->函数导入->复杂类型->获取列信息->创建新的复杂类型)

  2. 我的函数名称: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
{
   -------------------
 }
4

11 回答 11

74

好的 - 这是执行此操作的分步方法:

(1) 将您的存储过程添加到 EDMX 文件中(当您第一次创建它时,或者稍后通过使用Update model from database和选择该存储过程)

(2) 一旦你的模型中有存储过程 - 使用Model Browser添加一个Function Import

在此处输入图像描述

(3) 弹出的下一个对话框非常重要 - 您需要 (1) 定义存储过程返回复杂类型的集合,然后您需要 (2) 从该存储过程中获取列信息以了解哪些列它会返回,然后 (3) 你告诉 Visual Studio 根据该列信息生成一个新的复杂类型:

在此处输入图像描述

(4) 一旦你这样做了——你现在应该在模型浏览器的概念模型部分看到存储过程,并且新生成的复杂类型也应该出现在那里:

在此处输入图像描述

于 2012-10-11T07:21:51.947 回答
16

这是给罗斯布里戈里的

尝试将此行添加到存储过程的开头:

SET FMTONLY OFF 您可以在完成导入后删除它。

来源:- 为什么实体框架看不到我的存储过程的列信息?

于 2014-07-21T16:57:00.183 回答
16

如果这仍未解决,在添加函数导入后,转到解决方案资源管理器,右键单击您的 {name}.Context.tt 文件并执行“运行自定义工具”。该方法现在将显示在派生的 Context 类中。

在此处输入图像描述

这似乎是我正在使用的 Visual Studio 2012 中的一个错误,我还没有应用更新 1,我会尝试看看是否可以修复它。

于 2012-11-28T18:19:30.450 回答
4

正如 Sandeep 所说,EF 不支持导入从动态查询或临时表构建结果集的存储过程。

但是您不必重写整个 SP。

只需编写另一个名称相同的代码,它会返回正确的行格式,而无需使用动态 SQL 或临时表。然后使用 EF SP 添加功能,现在将自动生成复杂类型。

编辑:实际上更容易在 SP 的顶部进行评论,立即选择所需的行,其中包含使用 CASTS 指定的所有数据类型。当您需要将 SP 导入 EF 时,只需取消注释代码即可。

例如

CREATE PROCEDURE myProc ()
AS
BEGIN
-- 取消注释要导入的以下行:
-- SELECT CAST( 0 AS int) AS column1Name, CAST( 'a' AS varchar(50)) AS clumn2name

-- 需要导入时将 SP 内容注释掉。
<正确的SP内容>
END

然后删除存储的过程并创建原始过程。
不过,请保存您制作的临时导入 SP,以备不时之需。

于 2017-08-02T15:06:50.137 回答
3

EF 不支持导入从以下位置构建结果集的存储过程:

  • 动态查询
  • 临时表

重写您的存储过程以改用表变量。请记住在更新之前从模型中删除存储过程和函数导入,因为它不会生成复杂类型,除非它还添加了存储过程。或在更新存储过程后转到函数导入属性并使用获取列信息功能。

于 2015-07-30T21:14:47.653 回答
2
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
于 2017-04-27T11:06:55.013 回答
2

要正确添加复杂类型,请转到模型浏览器,右键单击功能,然后显示编辑,单击编辑并填充对话框。函数的名称应与存储过程的名称相同。单击确定按钮。现在函数已创建。然后右键单击创建的函数并再次进行编辑。复杂类型按钮旁边有一个更新按钮。使用该更新按钮对其进行更新。现在完全创建了复杂类型。

于 2017-11-14T09:18:38.963 回答
1

对我来说,我在将存储过程导入 EF 时遇到问题,不会(自动)生成复杂实体返回对象。然而,我发现,在注释掉我的存储过程(又名存储过程)的部分之后,当我重新导入存储过程(即使用函数导入编辑屏幕中的获取列信息按钮刷新)时,复杂类型然后可以生成!

简而言之,可能有一个 where 子句(或者可能是其他东西)导致 EF 不生成复杂类型。尝试注释掉存储过程的部分并将存储过程重新导入到

更新:

在我上面的调查之后,我发现没有生成复杂实体的原因是因为我的 sproc 使用的是视图(而不是典型的表)。出于好奇,我将视图更改为另一个表,只是为了看看会发生什么,以及生成的复杂实体。

因此,简而言之,如果您有视图,复杂实体可能不会自动生成。为了尝试,我暂时删除了视图,重新导入存储过程,生成复杂实体,然后将视图放回原处。但现在我的代码给出了异常。

稍后我会在了解更多信息时对此进行更新=)

更新:

修复了问题。真是愚蠢的错误!我使用的视图名称拼写不正确 =D。我有点生气,当我创建存储过程时 Sql Server 没有抛出错误.....我想这就是生活 :) 唉,问题现在解决了!

于 2014-12-12T22:20:01.647 回答
1

这是我实现多重搜索的 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

在实体框架中添加存储过程复杂类型

为什么 Entity Framework 看不到我的存储过程的列信息?

如果您必须更新下面的 SP 对我有用。如果存储过程更新,则更新复杂类型 如何让实体框架更新复杂类型?

于 2014-07-24T21:39:58.630 回答
0

转到模型浏览器

如果需要修改现有功能

在 Function Imports 下 >> 选择要修改的函数 >> 点击 Edit

您将需要更新功能以刷新,您可以看到需要添加的列

于 2019-07-15T19:49:39.313 回答
0

复杂类型未出现的问题也可能由于不同的原因而发生,这也是我在我们的案例中面临的问题。问题是由于 SPROC 中的语法错误,其中临时表定义如下 - create table #temp( col1 int, col2 nvarchar(100), col3 nvarchar(100), -- 注意最后的逗号);令人惊讶的是,当您编译存储过程时,SQL Server 不会抛出任何错误。删除逗号为我们解决了问题。

简而言之,虽然上述一些解决方案可能会根据具体问题起作用,但我的建议是检查您的存储过程中是否存在 SQL 可能会忽略但可能是此问题的根本原因的语法错误。谢谢。

于 2018-10-04T08:12:28.253 回答