EF4 - 选定的存储过程不返回任何列

EF4 - The selected stored procedure returns no columns(EF4 - 选定的存储过程不返回任何列)
本文介绍了EF4 - 选定的存储过程不返回任何列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个存储过程中进行了查询,该过程使用一些动态 SQL 调用了一些链接服务器.我知道 EF 不喜欢那样,所以我专门列出了将返回的所有列.然而,它仍然不喜欢那样.我在这里做错了什么?我只希望 EF 能够检测从存储过程返回的列,以便我可以创建我需要的类.

I have query in a stored procedure that calls some linked servers with some dynamic SQL. I understand that EF doesn't like that, so I specifically listed all the columns that would be returned. Yet, it still doesn't like that. What am I doing wrong here? I just want EF to be able to detect the columns returned from the stored procedure so I can create the classes I need.

请查看以下构成我的存储过程最后几行的代码:

Please see the following code that makes up the last lines of my stored procedure:

SELECT
    #TempMain.ID,
    #TempMain.Class_Data,
    #TempMain.Web_Store_Class1,
    #TempMain.Web_Store_Class2,
    #TempMain.Web_Store_Status,
    #TempMain.Cur_1pc_Cat51_Price,
    #TempMain.Cur_1pc_Cat52_Price,
    #TempMain.Cur_1pc_Cat61_Price,
    #TempMain.Cur_1pc_Cat62_Price,
    #TempMain.Cur_1pc_Cat63_Price,
    #TempMain.Flat_Length,
    #TempMain.Flat_Width,
    #TempMain.Item_Height,
    #TempMain.Item_Weight,
    #TempMain.Um,
    #TempMain.Lead_Time_Code,
    #TempMain.Wp_Image_Nme,
    #TempMain.Wp_Mod_Dte,
    #TempMain.Catalog_Price_Chg_Dt,
    #TempMain.Description,
    #TempMain.Supersede_Ctl,
    #TempMain.Supersede_Pn,
    TempDesc.Cust_Desc,
    TempMfgr.Mfgr_Item_Nbr,
    TempMfgr.Mfgr_Name,
    TempMfgr.Vendor_ID
FROM
    #TempMain
        LEFT JOIN TempDesc ON #TempMain.ID = TempDesc.ID
        LEFT JOIN TempMfgr ON #TempMain.ID = TempMfgr.ID

推荐答案

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

EF doesn't support importing stored procedures which build result set from:

  • 动态查询
  • 临时表

原因是要导入过程EF必须执行它.此类操作可能很危险,因为它会触发数据库中的某些更改.因为 EF 在执行存储过程之前使用了特殊的 SQL 命令:

The reason is that to import the procedure EF must execute it. Such operation can be dangerous because it can trigger some changes in the database. Because of that EF uses special SQL command before it executes the stored procedure:

SET FMTONLY ON

通过执行此命令,存储过程将仅返回有关其结果集中列的元数据",并且不会执行其逻辑.但是因为没有执行逻辑,所以没有临时表(或构建的动态查询),所以元数据不包含任何内容.

By executing this command stored procedure will return only "metadata" about columns in its result set and it will not execute its logic. But because the logic wasn't executed there is no temporary table (or built dynamic query) so metadata contains nothing.

您有两种选择(除了需要重新编写存储过程才能不使用这些功能的一种):

You have two choices (except the one which requires re-writing your stored procedure to not use these features):

  • 手动定义返回的复杂类型(我想它应该可以工作)
  • 使用 hack 并仅用于添加放在其开头的存储过程SET FMTONLY OFF.这将允许您的 SP 的其余代码以正常方式执行.只需确保您的 SP 不会修改任何数据,因为这些修改将在导入期间执行!成功导入后,删除该 hack.
  • Define the returned complex type manually (I guess it should work)
  • Use a hack and just for adding the stored procedure put at its beginning SET FMTONLY OFF. This will allow rest of your SP's code to execute in normal way. Just make sure that your SP doesn't modify any data because these modifications will be executed during import! After successful import remove that hack.

这篇关于EF4 - 选定的存储过程不返回任何列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
SSIS: Model design issue causing duplications - can two fact tables be connected?(SSIS:模型设计问题导致重复-两个事实表可以连接吗?)
SQL Server Graph Database - shortest path using multiple edge types(SQL Server图形数据库-使用多种边类型的最短路径)
Invalid column name when using EF Core filtered includes(使用EF核心过滤包括时无效的列名)
How should make faster SQL Server filtering procedure with many parameters(如何让多参数的SQL Server过滤程序更快)
How can I generate an entity–relationship (ER) diagram of a database using Microsoft SQL Server Management Studio?(如何使用Microsoft SQL Server Management Studio生成数据库的实体关系(ER)图?)